android binder 进程间通信机制1-binder 驱动程序
以下内容只大概列个提纲,若要明白其中细节,还请看源码:
申明:本人菜鸟,希望得到大神指点一二,余心足已
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
最新文章
- javascript数组 去重
- php使用file函数、fseek函数读取大文件效率分析
- 微课程--Android--Android开发学习体系
- SQL关于apply的两种形式cross apply和outer apply(转载)
- html5定位并在百度地图上显示
- 开博第一篇:DHT 爬虫的学习记录
- 终于解决“Git Windows客户端保存用户名与密码”的问题
- Ubuntu 修改时区
- css系列(布局):实现一个元素在浏览器中水平、垂直居中的几个方案
- 二进制中连续k个1-题解
- Spring component-scan 标签的实现
- Windows下的两个缺陷
- Swift实时画箭头的实现
- CentOS 安装Nginx1.14.0
- 洗礼灵魂,修炼python(40)--面向对象编程(10)—定制魔法方法+time模块
- linqpad使用方法备忘
- [转] VS2017 打包安装程序
- Partition Array Into Three Parts With Equal Sum LT1013
- Elasticsearch入门(一)
- Spring事务(二)事务自定义标签
热门文章
- C++之运算符优先级顺序表
- 关于css布局的记录(二) --网格布局
- pillow模块Image.crop()函数切割图片方法,参数说明
- C++中的try throw catch 异常处理
- QT执行shell脚本或者执行linux指令
- Linux常用命令及详细说明 — 结合工作(侧重性能监控,包括CPU、内存、IO、网络、磁盘等)
- SQL Server如何通过Page_ID找到对应的表
- [Go] 轻量服务器框架全局配置的实现以及解析json
- (办公)记事本_Linux目录
- 逻辑卷管理器LVM