> 文章列表 > Binder 驱动结构体列表

Binder 驱动结构体列表

Binder 驱动结构体列表

下面列举 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