下面列举 Binder 驱动相关的一些重要结构体
6~9 用于数据传输相关,其中 binder_write_read,binder_transaction_data进程空间和内核空间是通用的。
BWR 核心数据图表
binder_write_read 是整个 Binder IPC 过程,最为核心的数据结构之一
3.1 binder_proc
binder_proc 结构体:用于管理 IPC 所需的各种信息,拥有其他结构体的结构体。
free_buffers:记录所有空闲的 buffer,记录以buffer_size 为key的binder_buffer 的红黑树结构
allocated_buffers:记录所有已分配的 buffer,记录以buffer_size为key的 binder_buffer 的红黑树结构
buffers: 所有 buffer(包含空闲的和已分配的 buffer)的按地址由从低到高都连入到 buffers 链表中
ready_threads: 准 备 就 绪 的 线 程 个 数,往往是指进入binder_thread_read(),处于休眠等待状态的线程个数;ready_threads线程个数越多,代表系统越空闲。
requested_threads_started:是指系统已经启动的线程个数,在方法binder_thread_write() 中 , 执 行 一 次 BC_REGISTER_LOOPER ,则requested_threads_started++ , requested_threads– ;上限为max_threads.BC_REGISTER_LOOPER次数与requested_threads_started个数应该相等;
requested_threads:请求的线程个数,在方法 binder_thread_read()中,当 同 时 满 足 requested_threads_started 小于最大线程数,没有ready_threads 线 程 , 且 requested_threads=0 ,则执行requested_threads++。可见 requested_threads 取值要么为0,要么为1.
3.2 binder_thread
binder_thread 结构体代表当前 binder 操作所在的线程
looper 的状态如下:
enum { BINDER_LOOPER_STATE_REGISTERED = 0x01, // 创建注册线程 BC_REGISTER_LOOPER BINDER_LOOPER_STATE_ENTERED = 0x02, // 创建主线程 BC_ENTER_LOOPER BINDER_LOOPER_STATE_EXITED = 0x04, // 已退出 BINDER_LOOPER_STATE_INVALID = 0x08, // 非法
BINDER_LOOPER_STATE_WAITING = 0x10, // 等待中 BINDER_LOOPER_STATE_NEED_RETURN = 0x20, // 需要返回 };
binder_thread_write()过程
收 到 BC_REGISTER_LOOPER, 则线程状态为BINDER_LOOPER_STATE_REGISTERED;
收 到 BC_ENTER_LOOPER, 则 线程状态为BINDER_LOOPER_STATE_ENTERED;
收 到 BC_EXIT_LOOPER, 则 线程状态为BINDER_LOOPER_STATE_EXITED;
其他 3 个状态的时机:
BINDER_LOOPER_STATE_WAITING:
当停留在 binder_thread_read()的 wait_event_xxx 过程, 则设置该状态;
BINDER_LOOPER_STATE_NEED_RETURN:
binder_get_thread()过程, 根据 binder_proc 查询不到当前线程所对应的 binder_thread,会新建 binder_thread 对象;
binder_deferred_flush()过程;
BINDER_LOOPER_STATE_INVALID:
当 binder_thread 创建过程状态不正确时会设置
3.3 binder_node
binder_node 代表一个 binder 实体
binder_node 有一个联合类型:
union { struct rb_node rb_node;
struct hlist_node dead_node; };
当 Binder 对象已销毁,但还存在该 Binder 节点引用,则采用dead_node,并加入到全局列表 binder_dead_nodes;否则使用 rb_node 节点。
binder_node.ptr 对应于 flat_binder_object.binder;
binder_node.cookie 对应于 flat_binder_object.cookie。
3.4 binder_ref
binder 引用的查询方式如下
node + proc => ref (transaction)
desc + proc => ref (transaction, inc/dec ref)
node => refs + procs (proc exit)
3.5 binder_ref_death
struct binder_ref_death { struct binder_work work;
binder_uintptr_t cookie; };
cookie 只是死亡通知的 BpBinder 代理对象的指针
3.6 binder_write_read