一、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