理论教育 Ashmem驱动程序中的内存映射操作

Ashmem驱动程序中的内存映射操作

时间:2023-06-19 理论教育 版权反馈
【摘要】:Ashmem驱动程序并不提供文件的read操作和write操作,如果进程要访问这个共享内存,则必须将这个设备文件映射到自己的进程空间中,然后才能进行内存访问。有个这个文件描述符后,就可以直接通过函数mmap执行内存映射操作了。在上述代码中,检查了虚拟内存vma是否允许在不同进程之间实现共享。如果允许则调用函数shmem_set_file来设置它的映射文件和内存操作方法表。

Ashmem驱动程序中的内存映射操作

Ashmem驱动程序并不提供文件的read操作和write操作,如果进程要访问这个共享内存,则必须将这个设备文件映射到自己的进程空间中,然后才能进行内存访问。在类MemoryFile的构造函数中,创建Ashmem后需要把Ashmem设备文件映射到进程空间。映射功能是通过调用JNI方法native_mmap实现的,此JNI方法在文件frameworks/base/core/jni/adroid_os_MemoryFile.cpp中实现,具体代码如下。

在上述代码中,打开匿名设备文件/dev/ashmem获得文件描述符fd。有个这个文件描述符后,就可以直接通过函数mmap执行内存映射操作了。当调用函数mmap打开映射到进程的地址空间时,会立即执行Ashmem中的函数ashmem_mmap。函数ashmem_mmap的功能是,调用Linux内核中的函数shmem_file_setup在临时文件系统tmpfs中创建一个临时文件,这个临时文件与Ashmem驱动程序创建的Ashmem对应。函数ashmem_mmap在文件kernel/goldfish/mm/ashmem.c中定义,具体实现代码如下。(www.daowen.com)

在上述代码中,检查了虚拟内存vma是否允许在不同进程之间实现共享。如果允许则调用函数shmem_set_file来设置它的映射文件和内存操作方法表。

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

我要反馈