binder的会话链接与通信

一、binder会话

1、获取引用:client端通过serviceManager获取到server的地址;

2、包装本地引用:client将自身的引用打包到parcel;

3、发起会话:client端通过server的引用发送消息给server:transact

4、事务处理:ontransact;

5、结果返回:server解析数据获取到客户端的引用,然后使用这个引用执行回复。

二、通信上下文

在内核的binder中统一管理。

server、client、manager的binder引用都在其中。

打开binder的本质是在binder中建立通信上下文;

三、通信机制:系统调用与消息队列

服务进程与服务是一对多的关系。

每一个服务对应一个循环线程;

每一个循环线程对应一个事务队列(这里存疑);

1、客户端将事务数据、server信息、自身信息打包成parcel,通过系统调用发送给binder内核;

2、binder内核解析数据获取到server相关信息;

3、binder将事务数据放置到服务端的消息队列;

4、如果服务线程处于休眠状态,binder内核唤醒线程进行事务处理;

5、处理完成后,server端通过binder内核调用发送给客户端。

6、binder保存了客户端的信息(回调上下文)。

四、地址解析与寻址路由

servicemanager服务地址解析;

binder负责寻址路由;

五、parcel数据与地址

和tcp/ip协议类似,数据包中包含了发送、接收双方信息和事务数据、会话信息;

parcel包中也包含了类似的信息;

这些信息的处理在tcp/ip协议中由网络节点和终端的底层处理;

在binder中则有binder处理。

六、补充

本质上是使用了我们平常使用的共享内存是两个进程之间,即点到点的,如果有N个进程要两两通信而又不相互干扰,那么就必须有N*N个共享内存。Binder使用的共享内存是进程与binder设备之间,即binderMCU。

使用了共享内存,在驱动中还是会有一次拷贝的,进程A向进程B传递数据时,AbinderBB就可以直接读了

https://blog.csdn.net/yangzhiloveyou/article/details/14043801

原文地址:https://www.cnblogs.com/feng9exe/p/12365891.html