目录
引言:
一次拷贝
Binder一次通信过程
应用启动中的binder交互
C/S模式:
Binder COMMAND
BWR数据结构:
引言:
Android的binder是从openbinder发展过来的。包括了binder驱动,Native层,Java层。用经典问题作为对binder的理解之旅的起点。
为什么选择binder?
binder性能好,便捷,安全。
性能好,就是别人多次拷贝,binder只需要一次拷贝。
一次拷贝
一次拷贝怎么做到的?为什么少了一次拷贝呢?
别人:copy_from_user + copy_to_user
binder:copy_from_user + mmap映射,这里的关键就在于映射了,就是拷贝到了映射区就相当于拷贝到了对端了。
进程和内核虚拟地址映射到同一物理内存的操作是发生在数据接收端
拷贝一次是发生在数据发送端
虚拟进程地址空间vm_area_struct和虚拟内核地址空间vm_struct都映射到同一块物理内存空间
对于一次拷贝的概念有个比较直观的理解了。
Binder一次通信过程
怎么通信的呢?
binder的传输协议:
首先Client向Binder驱动写了BC_TRANSACTION
Binder驱动回复Client一个BR_TRANSACTION_COMPLETE表示已收到Client请求
Binder驱动发送BR_TRANSACTION指令给server进行处理,处理完成后就会返回BC_REPLY通知驱动,binder驱动收到Server端的BC_REPLY回复后,也会回复
BR_TRANSACTION_COMPLETE给到server同时回复BR_REPLY给Client,完成一次完整的通信流程。
有了通信过程的理解,再结合一个具体情境理解一下
应用启动中的binder交互
先准备几个概念:
C/S模式:
Client:BpBinder.transact()发送事务请求
Server:BBinder.ontransact()接收相应事务
Binder COMMAND
BINDER_WRITE_READ:binder读写交互场景,IPC.talkWithDriver
BINDER_SET_CONTEXT_MGR:servicemanager进程设置为context的管理者
BINDER_SET_MAX_THREADS::初始化ProcessState对象,open_Driver,主动调用ProcessState.setThreadPoolMaxThreadCount()
BINDER_VERSION:
BWR数据结构:
struct binder_write_read
write buff
read_buff
待续...