以下内容只大概列个提纲,若要明白其中细节,还请看源码:

申明:本人菜鸟,希望得到大神指点一二,余心足已

binder 设备:/dev/binder

binder 进程间通信涉及的四个角色:

Client  Service  ServiceManager  Binder驱动程序

一,Binder驱动程序

源码位置:kernel/[vendor]/[codename]/drivers/staging/android/binder.c

kernel/[vendor]/[codename]/drivers/staging/android/binder.h

等等相关文件。

1.基础数据结构

struct binder_work : 描述待处理的工作项

struct binder_node:  描述一个binder实体对象,每一个Service组件在Binder驱动程序中都对应一个Binder实体对象,用来描述它在内核中的状态。

struct binder_ref_death:  描述一个Service组件的死亡接收通知

struct binder_ref  :  描述一个Binder引用对象,每一个Client组件在Binder驱动程序中都对应有一个Binder引用对象,用来描述它在内核中的状态。

struct binder_buffer : 描述一个内核缓冲区,用来在进程间传输数据。每一个使用Binder进程间通信机制的进程,在Binder驱动程序中都有一个内核缓冲区列表,用来保存Binder驱动程序为它分配的内核缓冲区。

struct binder_proc : 用来描述一个正在使用Binder通信机制的进程,在进程调用open打开/dev/binder时,Binder驱动程序为进程创建该该结构体。

struct binder_thread : 描述Binder线程池中的一个线程。

struct binder_transaction : 描述进程间通信过程

struct binder_write_read : 描述进程间通信过程中传输的数据,包括输入和输出数据。

enum BinderDriverCommandProtocol : 定义了输入(Binder驱动)的命令协议代码,在向Binder写数据时使用。

enum BinderDriverReturnProctocol: 定义了输出(Binder驱动)的返回协议代码,在从Binder读返回结果时使用。

struct binder_ptr_cookie : 描述一个Binder实体对象或一个Service组件的死亡接收通知。

stuct binder_transaction_data : 描述进程间通信过程中所传输的数据,会作为命令协议代码BC_TRANSACTION和BC_REPLY的参数使用。

2.Binder 使用流程:

初始化:binder_init

    在目标设备上创建/proc/binder/proc目录

    每一个使用Binder机制通信的进程都在该目录下有对应的文件,通过该文件可以读取到进程的Binder线程池,Binder实体对象,Binder引用对象及内核缓冲区等信息

     还创建了 state states transactions transaction_log failed_taransaction_log 文件,记录Binder驱动程序运行情况。

Binder设备打开: binder_open

    为进程创建binder_proc结构体,并加入到全局hash队列binder_procs中。

Binder设备文件内存映射:binder_mmap

    为进程分配内核缓冲区,以便它可以用来传输进程间通信数据。

3. 内核缓冲区的管理:

分配内核缓冲区:binder_alloc_buf

释放内核缓冲区:binder_free_buf

查询内核缓冲区:binder_buffer_lookup

最新文章

  1. javascript数组 去重
  2. php使用file函数、fseek函数读取大文件效率分析
  3. 微课程--Android--Android开发学习体系
  4. SQL关于apply的两种形式cross apply和outer apply(转载)
  5. html5定位并在百度地图上显示
  6. 开博第一篇:DHT 爬虫的学习记录
  7. 终于解决“Git Windows客户端保存用户名与密码”的问题
  8. Ubuntu 修改时区
  9. css系列(布局):实现一个元素在浏览器中水平、垂直居中的几个方案
  10. 二进制中连续k个1-题解
  11. Spring component-scan 标签的实现
  12. Windows下的两个缺陷
  13. Swift实时画箭头的实现
  14. CentOS 安装Nginx1.14.0
  15. 洗礼灵魂,修炼python(40)--面向对象编程(10)—定制魔法方法+time模块
  16. linqpad使用方法备忘
  17. [转] VS2017 打包安装程序
  18. Partition Array Into Three Parts With Equal Sum LT1013
  19. Elasticsearch入门(一)
  20. Spring事务(二)事务自定义标签

热门文章

  1. C++之运算符优先级顺序表
  2. 关于css布局的记录(二) --网格布局
  3. pillow模块Image.crop()函数切割图片方法,参数说明
  4. C++中的try throw catch 异常处理
  5. QT执行shell脚本或者执行linux指令
  6. Linux常用命令及详细说明 — 结合工作(侧重性能监控,包括CPU、内存、IO、网络、磁盘等)
  7. SQL Server如何通过Page_ID找到对应的表
  8. [Go] 轻量服务器框架全局配置的实现以及解析json
  9. (办公)记事本_Linux目录
  10. 逻辑卷管理器LVM