Binder驱动的代码都在kernel里面,这里就简单讲一下里面涉及到的几个东西: 1.Memory 我们知道其他的一些IPC的方法,在传递数据的时候,一般都会有两次拷贝,发送者拷贝到底层,底层再拷贝给接收者。 但是Binder通过共享內存进行通信,只有一次copy。 看下面的图中,每个涉及到Binder通信的进程,都会有一个共享内存,它是binder驱动和进程之间的共享内存。但是进程是无法对内存进行写操作的,是只读的。
Process A向Process B传递数据時,这些数据会被driver从ProcessA copy 到 binder和ProcessB之间的共享內存中。ProcessB已经映射过地址,就可以直接读取内存里面的数据了,就不需要再做一次拷贝动作了
在ProcessState初始化的时候,就会调用mmap()去映射地址。 ./frameworks/native/libs/binder/ProcessState.cpp 1 ProcessState::ProcessState() 2 : mDriverFD(open_driver()) 3 , …. 4 { 5 if (mDriverFD >= 0) { 6 mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0); 7 ... 8 } 9 }
2.binder_ref / binder_node 一个tree保存binder_node;另外两个tree保存binder_ref,这两个tree的内容其实都一样,只是为了便于搜索,就建了两个不同key的tree。
这三个tree都具体存写什么东西? -->这样说,一个process里有个实体对象,就有多少个binder_node;一个process有多少个代理对象指向远端,就有多少个binder_ref.
看下面的图中:
|
|
来自: just_person > 《Binder项目》