进程间通讯——Binder
2020-02-01 本文已影响0人
修塔寻千里
Binder主要涉及以下四个组成元素:
- Binder驱动
- Service Manger
- Binder Client
- Binder Server
Binder的本质就是进程1希望与进程2进行交互,它们之间必须借助Binder驱动来实现通讯,Service Manner用于提供进程的地址信息。
Binder驱动
Binder驱动是一个标准的Linux驱动,具体而言,Binder Driver会把自己注册成一个misc device,并向上层提供一个/dev/binder结点——Binder结点并不对应真实的硬件设备,Binder驱动运行于内核态,可以提供open(),ioctl(),mmap()等常用的文件操作。
使用流程:
1、打开Binder驱动
层次进程在访问Binder驱动时,首先需要打开/dev/binder结点,这个操作最终实现的是binder_open()方法。
2、内存映射
对于应用程序而言,通过mmap()返回值得到一个内存地址(虚拟地址),这个地址通过虚拟内存转换(分段、分页)后,最终会指向物理内存的某个位置。
对于Binder驱动而言,它有一个指针指向某个虚拟内存地址,而经过虚拟内存转换后,它和应用程序中指向的物理内存处于同一个位置。
这时Binder和应用程序就拥有了若干共用的物理内存块,当两个进程共同指向相同的物理地址即可实现进程间的数据共享,且Binder驱动只用了一次复制。
Binder内存映射
3、binder_ioctl
这是Binder驱动实现业务的重要方法,Binder并不提供read()和write()等文件操作,最终由binder_ioctl来实现。
ServiceManger
ServiceManger的功能可以类比为互联网中“DNS”服务器,“IP地址”为0,SM是一个标准的Binder Server,其他Binder Server向其注册,Binder Client向其请求并查询服务的ID。
ServiceManger内部维护着一个svclist列表,用于存储所有的Server相关信息(以svcinfo为数据结构),查询和注册都是基于这个表展开的。
参考资料
- 深入理解Android内核设计思想. 林学森。