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提供了匿名共享内存在用户空间的调用封装。