声明
- 其实对于Android系统的Ashmem匿名共享内存系统早就有分析的想法,记得2019年6、7月份Mr.Deng离职期间约定一起对其进行研究的,但因为我个人问题没能实施这个计划,留下些许遗憾…
- 文中参考了很多书籍及博客内容,可能涉及的比较多先不具体列出来了;
- 本文使用的代码是LineageOS的cm-14.1,对应Android 7.1.2,可以参考我的另一篇博客:cm-14.1 Android系统启动过程分析(1)-如何下载Nexus5的LineageOS14.1(cm-14.1)系统源码并编译、刷机
1 概述
Android系统中提供了独特的匿名共享内存子系统Ashmem (Anonymous Shared Memory),它以驱动程序的形式实现在内核空间中。Ashmem有如下两个特点:
- 能够辅助内存管理系统来有效地管理不再使用的内存块。
- 通过 Binder进程间通信机制来实现进程间的内存共享。
对于 Android 系统的匿名共享内存子系统来说,其主体是以驱动程序的形式实现在内核空间的,同时,在系统 Native 层提供了 C/C++ 调用接口和 Framework 层提供了 Java 调用接口。其实对于 Android 系统中的应用程序框架层的 Java 调用接口来说,是通过 JNI 方法来调用 Native 层的 C/C++ 调用接口,最后需要进入到内核空间的 Ashmem 驱动程序中去。
Android 系统中的匿名共享内存 Ashmem 驱动程序,利用 Linux 的共享内存子系统导出的接口来实现自己的功能。在 Android 系统匿名共享内存系统中,其核心功能是实现创建 (open)、映射(mmap)、读写(read/write)以及锁定和解锁(pin/unpin)。在学习Ashmem之前建议复习下Linux中的内存映射、共享内存相关知识。
作为Android Native层+Framework层开发者而言,对内核的研究就不深入了,这里详细可参考《深入解析Android 虚拟机》的第5章,而且对于驱动这种底层代码很少改动,很多Android系统相关书籍对这部分的分析也都大同小异。在我这篇中先列出标题,通过这些标题也大致知道Ashmem驱动做了哪些操作,有时间再做分析。