有人能解释一下为什么要创建ashmem吗?
我正在浏览mm/ashmem.c
。据我所知,内核认为ashmem是可进行mmap映射的文件后端内存。但那么,为什么要费力地实现ashmem呢?似乎可以通过挂载RAM fs,然后使用filemap/mmap来共享内存实现相同的功能。
我确定ashmem可以做更多的花哨事情--从代码看,它似乎与固定/取消固定页面有关?
有人能解释一下为什么要创建ashmem吗?
我正在浏览mm/ashmem.c
。据我所知,内核认为ashmem是可进行mmap映射的文件后端内存。但那么,为什么要费力地实现ashmem呢?似乎可以通过挂载RAM fs,然后使用filemap/mmap来共享内存实现相同的功能。
我确定ashmem可以做更多的花哨事情--从代码看,它似乎与固定/取消固定页面有关?
Ashmem允许没有血缘关系的进程通过名称共享内存映射,这些映射会自动清理。
普通的匿名内存映射和System V共享内存缺少一些要求。
当运行的程序不再引用时,System V共享内存段会继续存在(这有时是一种功能,有时是一种麻烦)。
匿名共享映射可以从父进程传递给子进程,这很不灵活,因为有时您希望没有这种关系的进程共享内存。
请问为什么会创建ashmem?
David Turner(Android NDK的常客)在为什么删除了bionic/libc/include/sys/shm.h?中回答了这个问题:
……Cupcake中已经删除了System V IPC。有关详细信息,请参见bionic/libc/docs/SYSV-IPC.TXT。
简而言之,System V IPC是设计上存在漏洞的,不适用于Android的运行时环境,因为杀死进程以为其他进程腾出空间是非常普遍的。最终结果是,任何依赖这些IPC的代码都可能填满内核的SysV IPC密钥内部表,这只能通过重新启动来安全地解决。
我们希望未来提供不具有相同问题的替代机制。我们目前提供的一种机制是ashmem,它专门为Android设计,以避免这种问题(尽管它的文档不够完善)。我们可能需要类似的机制来处理信号量和/或消息队列。