一、背景

前两天跟同事聊到了平台的机制,聊的过程中说到一个问题,为什么不直接使用mmap文件模式呢?它所说的数据只拷贝一次的效率优势mmap也同样具备,为什么要重新封装一套的写机制呢。封装的机制与mmap相比,其主要优势在哪里呢?

查了网上一些资料还是不明就里,于是去翻了一下解读源码的书[1]binder机制,现总结如下。

二、的进程间通信机制

进程的虚拟地址空间分为用户地址空间和内核地址区间,分别对应用户态程序可以访问的虚拟地址区域和只有内核态才能访问的虚拟地址区域。

不同进程的虚拟地址空间的用户地址空间是互相隔离的,进程A无法直接使用进程B中的用户态虚拟地址,比如说A进程得到的内存地址无法给B进程直接使用。为了实现多进程通信,必然需要内核态参与,因为不同进程的内核地址空间是共享的(虚拟地址相同),而内核地址空间只有内核态才能访问。

在文件系统中创建了一个设备文件:/dev/,其驱动程序工作在内核态。各进程即通过此驱动程序进行通信。

1. 设备驱动程序初始化

在其驱动程序初始化函数中向操作系统注册了一个虚拟的设备(misc类型),并指定了其设备文件操作方法的具体实现(),详见以下代码片断。

//对binder设备文件/dev/binder进行文件操作,驱动程序内部会调用binder_xxx方法static struct file_operations binder_fops = {    .owner = THIS_MODULE,    .poll = binder_poll,    .unlocked_ioctl = binder_ioctl,    .mmap = binder_mmap,    .open = binder_open,    .flush = binder_flush,    .release = binder_release,};
//将binder定义为misc设备static struct miscdevice binder_miscdev = { .minor = MISC_DYNAMIC_MINOR, .name = "binder", .fops = &binder_fops};

//binder设备驱动程序的初始化函数static init __init binder_init(void){ ... //注册binder设备,具体定义见上方static变量定义 ret = misc_register(&binder_miscdev); ...}

由以上代码可知,当用户态应用程序对 /dev/ 文件调用 open 方法时,工作在内核态的驱动程序会调用对应的方法,同理,对其调mmap方法时,驱动程序会调用方法。

2. 设备的文件操作

以下讲一下这几个文件操作方法内部进行的主要工作:

将 proc 存到跟文件句柄相关的 file 结构体中(filep->)中,这样后续拿到filep的mmap等方法就能顺利拿到proc了

mmap ——

以下概要地列出中的主要工作:

//filep对应open()返回的句柄,其中filep->private_data存了struct binder_proc指针//vma代表一段用户态地址空间(虚拟地址空间)static int binder_mmap(struct file *filep, struct vm_area_struct *vma){    1. 确保vma指定的内存大小不超过4M    2. 检查vma中指定的内存区域是只读的(不可写,不可拷贝)    3. 在内核地址空间中分配一块与vma大小一样的一段空间(也是虚拟地址空间),叫做area    4. 为vma和area分配实际物理页面(存在proc->buffers中),并将vma和area中的虚拟地址映射到分配的物理页的地址上        * 实际先只分配一个物理页,后面需要的时候再分配更多物理页}

一个使用Binder进程间通信机制的进程只有将Binder设备文件映射到自己的地址空间,Binder驱动程序才能为它分配内核缓冲区,以便用来传输进程间通信数据。

当驱动程序要将一块数据传输给一个进程B时,它可以先把这块数据保存在为B分配的内核缓冲区中,然后再把这块内核缓冲区的用户空间地址告诉B,则B就可以读取缓冲区中的数据了。

上面讲了驱动程序如何把数据传给B,那么A如何把数据传给驱动程序呢?这里就会用到write方法,在驱动程序内部,write/read方法都会被转为(...)方法调用:

若 bwr 中有要读的数据,则调用 进行读操作

三、写在后面

本文对底层通信机制做了一些简单的梳理,受作者知识所限,很多细节没有详细展开。如果有写错或理解错的地方,欢迎读者在评论区批评指正。另外,对于希望了解更多细节或其他“上层建筑”的读者binder机制,推荐翻阅参考资料或其他更详细的文章。

四、参考资料


限时特惠:
本站持续每日更新海量各大内部创业课程,一年会员仅需要98元,全站资源免费下载
点击查看详情

站长微信:Jiucxh

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注