系统情景源代码笔记_binder机制

来源:互联网 发布:asm算法源码 编辑:程序博客网 时间:2024/06/05 09:31

Binder采用C/S通信方式.
做为程序员 我们需要知道如何编写合适的Binder接口,即如何使用binder.
第一部分 原理:

这里写图片描述
图解:
->的意思是: open mmap ioctl.
ioctl: 设备驱动程序中对设备的I/O通道进行管理的函数。
所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。

client进程 (发送数据) -> binder驱动程序(创建一个引用对象) -> 查询server manager(本身也是组件)中的server组件的binder本地对象 -> 建立通信

这里写图片描述
各个binder对象解释:
1.binder代理对象(BPbinder) 在用户空间创建,运行在client进程中.
2.binder本地对象(Bbinder) 在用户空间中创建,运行在server进程中.
3.binder引用对象(binder_ref)由驱动程序创建,并被用户空间中的binder代理对象所引用.
4.binder实例(binder_node) 由驱动程序创建,并被驱动程序中的引用对象所引用(可以由多个引用对象指向同一实例)

同一个server进程可以提供多个组件(server组件)来为 client进程提供服务.
同时,一个client进程可以向多个server进程请求服务.(需要多个Bpbinder代理)

每一个进程都维护了一个Binder线程池,所以 server进程可以并发地提供服务,client进程可以并发地发送请求.

每一个server组件在binder驱动程序中都对应一个binder实例(binder_node)。这个实例存在Binder驱动程序中.(进程中以引用的形式存在?).
是的 server进程中也有一个binder本地实例,该实例最终处理client进程发过来的数据

server组件中保存了binder的引用(binder_node的引用).通过该引用可以找到binder驱动程序中的binder实例,这个实例又能去访问一个server组件.

每一个client组件在binder驱动程序中都对应一个binder引用对象! 描述client在内核中的状态.

每一个binder实例都维护了一个HASH表,谁引用我 我就保存谁的引用对象.binder驱动程序通过句柄值(desc)找到对应的binder引用对象.

当server组件死亡时,binder驱动程序 通过server死亡组件的binder引用找到binder驱动程序中对应的binder实例,
通过该实例的refs找到所有引用该实例的client进程,最后binder驱动将binder_ref_death结构体发到client的队列中去等待client处理.

0 0