当前位置: 首页 > article >正文

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

 

 


http://www.kler.cn/a/13862.html

相关文章:

  • winForm常用控件
  • 别再重复造轮子了,一个 Spring 注解轻松搞定循环重试功能!
  • 免费且不丢失数据的MBR转GPT软件!
  • 实验架构的部署
  • SQL学习(三)----认识sql
  • C++观察者模式探索:从设计到应用,一站式全面解析
  • 学校生活--英文
  • Mapreduce中WordCount源码理解
  • C#基于ASP.NET实现的共享笔记服务系统
  • Java-内部类
  • diff算法策略
  • Linux 文件系统全面解析:从基本原理到实际应用
  • 详解树与二叉树的概念,结构,及实现(上篇)
  • DNS服务
  • mybatis01-Lombok、mybatis原理、参数处理、模糊查询、结果封装
  • Kaggle往期赛 | 多目标推荐系统大赛baseline
  • 【源码篇】安卓源码解析(持续总结)
  • MinIO快速入门
  • 操作系统考试复习——第一章
  • 【IAR工程】STM8S基于ST标准库读取DHT11数据