Ashmem是安卓在linux基础上添加的驱动模块,就是说安卓有linux没有的功能。
Ashmem模块在内核层面上实现,在运行时库和应用程序框架层提供了访问接口。在运行时库层提供的是C++接口,在应用框架层提供的是java接口。
首先从驱动模块开始分析起,驱动模块加载之后首先进行misc_register来注册一个ashmem_misc设备。这个设备文件就是"/dev/ashmem"。这个设备对用户层提供了四个操作open、mmap、release、ioctl。但是没有read和write操作,这两个操作靠mmap来实现。
- open(): 对应于ashmem_open,实质上是创建一个ashmem_area结构体,返回到文件结构中。这么做的目的是打开ashmem
- mmap(): 对应于ashmem_mmap,功能是在tmpfs中创建临时文件,并且设置文件映射
- ioctl(): 对应ashmem_mmap,通过swtich结构提供不同的设置功能
这里有一个例子,就是打开匿名共享内存文件的函数执行流程。
应用层类:MemoryFile的构造函数——》JNI函数:native_open——》运行库:ashmem_create_region——》Ashmem驱动的接口函数:open、ioctl——》Ashmem驱动的函数:ashmem_open、ashmem_ioctl
注意这里的驱动接口open是对应驱动中的ashmem_open的,ioctl是对应ashmem_ioctl的。这个我个人感觉有点像Windows驱动的IRP主功能码对应有分发函数一样,不知道这样理解对不对0.0,当然了Windows应用层是是用固定的函数(如WriteFile等,然后由I/O管理器进行操作的),是不能自定义的。