我已经读过,每个android应用程序都在不同的Dalvik VM进程上运行(均由合子分叉)。
我还读到,这些VM确实是轻量级的,并且到目前为止在写缓冲区上使用了复制功能。
但是,我还读到,这样做不是出于安全原因(例如隔离)-实际上,dalvik vm不应被视为安全边界,Google表示。
所以我的问题是:为什么每个进程都必须在不同的VM上运行?
我已经读过,每个android应用程序都在不同的Dalvik VM进程上运行(均由合子分叉)。
我还读到,这些VM确实是轻量级的,并且到目前为止在写缓冲区上使用了复制功能。
但是,我还读到,这样做不是出于安全原因(例如隔离)-实际上,dalvik vm不应被视为安全边界,Google表示。
所以我的问题是:为什么每个进程都必须在不同的VM上运行?
Answers:
在Android中,每个应用程序都以单独的用户身份运行。在Linux内核中,每个进程都由一个用户拥有,因此不可能在单个Linux进程上运行多个Dalvik应用程序。
由于Linux,运行多个Dalvik VM实例的开销很轻 fork()
系统调用是写时复制的,对共享COW页面的写操作将导致“页面错误”,并且该页面将被复制;因此,即使RAM中大多数VM的内存区域是共享的,VM之间也没有“共享状态”。
分叉进程仅提供状态隔离,而不提供特权隔离。
dalvik vm不应被视为安全边界
这是因为VM无法强制执行安全边界。VM正在用户模式(与其执行的程序相同的模式)上运行,这意味着VM中的错误可能会允许应用程序以非预期的方式修改VM状态。但是,内核以特权模式运行并且可以强制执行安全边界。