进程间通讯——Binder

2020-02-01  本文已影响0人  修塔寻千里

Binder主要涉及以下四个组成元素:

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为数据结构),查询和注册都是基于这个表展开的。

参考资料

上一篇下一篇

猜你喜欢

热点阅读