- Android系统级深入开发
- 韩超 梁泉
- 345字
- 2020-08-26 21:43:42
4.3.3 Ashmem驱动程序
Ashmem的含义是匿名共享内存(Anonymous Shared Memory),通过这种内核的机制,可以为用户空间程序提供分配内存的机制。Ashmem提供给用户空间的接口是主设备号为10的Misc字符设备,其次设备号是动态生成的。在用户空间中,Ashmem的设备节点为/dev/ashmem。
Ashmem驱动程序的配置选项文件是init/目录中的Kconfig。
Ashmem的源代码在内存管理的mm目录中,在include/linux/中的ashmem.h文件是Ashmem系统的头文件。Makefile的内容如下所示:
mm/Makefile:obj-$(CONFIG_ASHMEM) += ashmem.o
ashmem.c中也实现了一个misc设备,提供了mmap和ioctl接口。ioctl的命令在ashmem.h中定义,内容如下所示:
#define ASHMEM_SET_NAME _IOW(__ASHMEMIOC, 1, char[ASHMEM_NAME_LEN]) #define ASHMEM_GET_NAME _IOR(__ASHMEMIOC, 2, char[ASHMEM_NAME_LEN]) #define ASHMEM_SET_SIZE _IOW(__ASHMEMIOC, 3, size_t) #define ASHMEM_GET_SIZE _IO(__ASHMEMIOC, 4) #define ASHMEM_SET_PROT_MASK _IOW(__ASHMEMIOC, 5, unsigned long) #define ASHMEM_GET_PROT_MASK _IO(__ASHMEMIOC, 6) #define ASHMEM_PIN _IOW(__ASHMEMIOC, 7, struct ashmem_pin) #define ASHMEM_UNPIN _IOW(__ASHMEMIOC, 8, struct ashmem_pin) #define ASHMEM_GET_PIN_STATUS _IO(__ASHMEMIOC, 9) #define ASHMEM_PURGE_ALL_CACHES _IO(__ASHMEMIOC, 10)
Ashmem为Android系统提供了内存分配功能,实现类似malloc的功能,更类似POSIX的共享内存。
在Android用户空间C工具库libcutils库对Ashmem进行封装并提供接口, system/core/include/cutils/ashmem.h是简单封装头文件;system/core/libcutils/ashmem-dev.c提供了匿名共享内存在用户空间的调用封装。