理论教育 Ashmem驱动的初始化及接口暴露

Ashmem驱动的初始化及接口暴露

时间:2023-06-19 理论教育 版权反馈
【摘要】:通过Ashmem驱动的初始化函数,可以获取如下两点信息。Ashmem给用户空间暴露了什么接口,即创建了什么样的设备文件。Ashmem驱动程序在文件kernel/common/mm/ashmem.c中实现,其中函数ashmem_init用于实现模块初始化处理,主要实现代码如下。与此同时,直接对内存进行了读写操作,所以不需要通过read和write方式进行文件操作。函数native_open通过运行时库提供的接口ashmem_create_region创建Ashmem,这个接口在文件system/core/libcutils/ashmem-dev.c中实现,具体代码如下。在上述代码中,通过执行三个文件操作系统调用的方式和Ashmem驱动程序进行交互。

Ashmem驱动的初始化及接口暴露

通过Ashmem驱动的初始化函数,可以获取如下两点信息。

Ashmem给用户空间暴露了什么接口,即创建了什么样的设备文件。

Ashmem提供了什么函数来操作这个设备文件。

Ashmem驱动程序在文件kernel/common/mm/ashmem.c中实现,其中函数ashmem_init用于实现模块初始化处理,主要实现代码如下。

在上述代码中,在加载Ahshmem驱动程序时会创建一个设备文件“/dev/ashmem”,这是一个misc类型的设备。通过函数misc_register来注册misc设备,调用这个函数后会在“/dev”目录下生成一个ashmem设备文件。在设备文件中一共提供了open、mmap、release和ioctl四种操作函数,此处并没有read和write操作函数,原因是读写共享内存的方法是通过内存映射地址来进行的,通过mmap系统调用将这个设备文件映射到进程地址空间中。与此同时,直接对内存进行了读写操作,所以不需要通过read和write方式进行文件操作。(www.daowen.com)

Ashmem的创建功能是在文件frameworks/base/core/java/android/os/MemoryFile.java中实现的,此文件调用了类MemoryFile的构造函数,MemoryFile的构造函数调用了JNI函数native_open,这样便创建了Ashmem文件。JNI方法native_open在文件frameworks/base/core/jni/adroid_os_MemoryFile.cpp中实现,具体代码如下。

函数native_open通过运行时库提供的接口ashmem_create_region创建Ashmem,这个接口在文件system/core/libcutils/ashmem-dev.c中实现,具体代码如下。

在上述代码中,通过执行三个文件操作系统调用的方式和Ashmem驱动程序进行交互。通过open操作打开设备文件ASHMEM_DEVICE,通过ioctl操作设置Ashmem的名称和大小。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈