Binder 驱动层数据结构之间的关系

2016-3-16 chenhui Binder

先上神图:



然后再来解释这张神图。


首先,不管是 Client 还是 Service,他都打开 /dev/binder 来使用 Binder 通信,都有一个 binder_proc 结构体。

binder_proc 有两个红黑树,一个存放 binder_node,另一个存放 binder_ref。前者叫实体对象,Service 用他来描述自己;后者叫引用对象,Client 用他来指向一个实体对象。


binder_proc 有一片内存专门用来存放通信数据(这片内存在 mmap() 时申请),里面的内存被 binder_buffer 来分块管理,binder_buffer 又根据是否已被分配放在两个不同的红黑树中。


Client 和 Service 都有线程池,他们平时都睡眠在一个等待队列里。当对方发送消息给自己时,会把消息封装成一个工作项(binder_work),并插入这个线程的 todo 队列(有两个 todo 队列,一个是 binder_proc 的,另一个是线程自己的,先插线程自己的,插不了再插 binder_proc),并把线程从等待队列中唤醒。


上述就是 Binder 驱动的主要数据结构的关系分析。




发表评论:

Copyright ©2015-2016 freehui All rights reserved