一些描述性的总结,大多数前面两篇已经描述过了
进程结构:
binder_proces 是保存在binder驱动中的一个全局的链表
注册服务的时候,会在service_manager中创建ref,在服务的进程中创建node,客户进程请求服务的时候会在自己的进程创建ref,都保存在各自的proc的红黑树的结构中
数据流向
- BBinder会转成一个flat_binder_object,然后加上 name 序列化到 Parcel里
- 然后加上 target= 0和code=ADD_SERVICE 转成 binder_transation_data 对象,
- 然后加上 cmd = BC_TRANSACTION 写入到IPC_ThreadState的mOut 里面,mOut和mIn 构造一个 binder_write_read 对象, 发送给 binder 驱动
- binder 驱动拷贝这个数据到内核,构造一个 binder_transaction_data 发送给服务进程的todo队列,同时向用户进程回复BR_COMPLETE
- 服务进程构造 binder_transaction_data 和 BC_REPLY 回复给 binder 驱动
请求过程
传输数据的大小限制
取决于binder_open
的参数:
- ServiceManager 初始化的时候传入的是 128*1024,也就是128k, 这个我们用不上
- 其他系统服务初始化的时候传入的是 BINDER_VM_SIZE(1*1024*1024-4096*2),也就是 1M-8K