为什么每个Android应用程序都在不同的Dalvik VM进程上运行?


10

我已经读过,每个android应用程序都在不同的Dalvik VM进程上运行(均由合子分叉)。

我还读到,这些VM确实是轻量级的,并且到目前为止在写缓冲区上使用了复制功能。

但是,我还读到,这样做不是出于安全原因(例如隔离)-实际上,dalvik vm不应被视为安全边界,Google表示。

所以我的问题是:为什么每个进程都必须在不同的VM上运行?

Answers:


11

在Android中,每个应用程序都以单独的用户身份运行。在Linux内核中,每个进程都由一个用户拥有,因此不可能在单个Linux进程上运行多个Dalvik应用程序。

由于Linux,运行多个Dalvik VM实例的开销很轻 fork()系统调用是写时复制的,对共享COW页面的写操作将导致“页面错误”,并且该页面将被复制;因此,即使RAM中大多数VM的内存区域是共享的,VM之间也没有“共享状态”。

分叉进程仅提供状态隔离,而不提供特权隔离。

dalvik vm不应被视为安全边界

这是因为VM无法强制执行安全边界。VM正在用户模式(与其执行的程序相同的模式)上运行,这意味着VM中的错误可能会允许应用程序以非预期的方式修改VM状态。但是,内核以特权模式运行并且可以强制执行安全边界。


4

每个Dalvikvm进程都在运行uid的应用程序的用户ID()拥有的沙盒环境下运行,应注意的是,在安装该应用程序后,将为uid每个已安装的应用程序分配并分配该应用程序。

最终结果是,由于uid分配的不同,每个正在运行的应用程序都无法践踏另一个进程,从而为正在运行的应用程序提供了保护。

看它的另一种方式是这样的-有有是一个共同uid所有应用程序,然后恶意应用程序可以真正原因的破坏,是窥视到一个人的设置,覆盖,拦截其他应用程序的运行代码和做各种事情坏的TM到应用。


3

Dalvik虚拟机不提供一个安全边界,但是内核在虚拟机中运行的进程方面提供了一个安全边界。这就是为什么,例如,它也没有什么大不了的Android应用程序运行本地代码, (或多或少)按照定义在VM外部运行。它仍然处于过程中,并且内核确保该过程将不会损害其他应用程序,无论该过程是否在VM中运行代码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.