理论教育 如何打开匿名共享内存设备文件?

如何打开匿名共享内存设备文件?

时间:2023-06-19 理论教育 版权反馈
【摘要】:当open进入内核后,会调用函数ashmem_open打开Ashmem设备文件,此函数能够为程序创建一个ashmem_area结构体,具体实现代码如下。在函数ashmem_create_region中调用了两次ioctl文件操作,功能是设置新建Ashmem的名字和大小。函数set_name也是在文件kernel/goldfish/mm/ashmem.c中实现的,功能是把用户空间传进来的Ashmem的名字设置到asma->name域中。到此为止,创建Ashmem的过程就全部介绍完毕了。

如何打开匿名共享内存设备文件?

当open进入内核后,会调用函数ashmem_open打开Ashmem设备文件,此函数能够为程序创建一个ashmem_area结构体,具体实现代码如下。

上述代码的执行流程如下:

通过函数nonseekable_open设置这个文件不可以执行定位操作,即不可执行seek文件操作。

通过函数kmem_cache_zalloc在刚创建的slab缓冲区ashmem_area_cachep中创建一个ashmem_area结构体,并将创建的结构体保存在本地变量asma中。

初始化变量asma的其他域,其中域name初始为宏ASHMEM_NAME_PREFIX,宏ASHMEM_NAME_PREFIX的定义代码为:

将结构ashmem_area保存在打开文件结构体的private_data域中,此时通过使用Ashmem驱动程序,可以在其他模块通过private_data域来取回这个ashmem_area结构。

在函数ashmem_create_region中调用了两次ioctl文件操作,功能是设置新建Ashmem的名字和大小。在文件kernel/comon/mm/include/ashmem.h中,ASHMEM_SET_NAME和ASHMEM_SET_SIZE分别表示新建内存的名字和大小,具体定义代码如下。(www.daowen.com)

其中ASHMEM_SET_NAME的ioctl调用会进入到Ashmem驱动程序函数ashmem_ioctl中,此函数能够将从用户空间传进来的Ashmem的大小值保存在对应的asma->size域中。函数ashmem_ioctl的实现代码如下。

上述代码主要完成如下两个功能:

“struct ashmem_area*asma=file->private_data”:获取描述将要改名的Ashmem asma。

“ret=set_name(asma,(void__user*)arg)”:调用函数set_name修改Ashmem的名称。

函数set_name也是在文件kernel/goldfish/mm/ashmem.c中实现的,功能是把用户空间传进来的Ashmem的名字设置到asma->name域中。函数set_name的具体实现代码如下。

到此为止,创建Ashmem的过程就全部介绍完毕了。

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

我要反馈