要学习Android进程间通信那么第一步要掌握的就是Binder驱动,Binder驱动提供很多命令其中最常用的三个命令是open,mmap,ioctl,分别看一下这三个命令都是干啥的
binder_open
上层需要访问binder驱动时,首先需要打开/dev/binder结点。实现是在binder_open中
Binder驱动会在/proc的系统目录下生成管理信息,每个进程都是自己独立的管理信息,比如/proc/binder/proc/<PID>
初始化binder_proc,初始完成后添加到Binder的全局管理中binder_procs队列
总结
1,Binder驱动给用户创建了一个它自己的binder_proc实体,这个binder_proc的实体就是以后Binder设备操作的基础
binder_mmap
mmap主要是用于映射内核内存空间和用户内存空间的,映射如下 Binder映射关系.png首先我们要明白的是Android中的进程分为用户区域和内核区域,mmap做映射是将用户区域的内存和内存区域的内存映射到同一片物流内存上,如图中B进程映射一样
然后,将A进程的内核空间内存也映射到同一片物理内存上,将要共享的内容直接使用copy_from_user从用户空间内存复制到内存空间内存上,这样就可以进程间通信了,同时也保证了Binder只需复制一次
binder_proc有三颗红黑树负责管理内存
1,list_head_buffers所有内存块都要注册在这
2,rb_root_free_buffers没有分配物理内存的空间空闲内存块
2,rb_root_allocated_buffers分配了物理内存的内存块
应用程序申请内存最大申请4m,在分配的时候只会事先分配一页也就是4k,然后根据需求在分配
总结
1,mmap就是为了实现用户空间内存和内核空间内存映射
binder_ioctl
这个方法主要是用于实现Binder驱动的读写,以及各种协议
最重要的是BINDER_WRITE_READ可用于读写Binder驱动
BC_INCREFS
BC_ACQUIRES
BC_RELEAS
BC_DECREFS
上面的用于控制引用计数
BC_FREE_BUFFER 使用完用于释放binder_buffer
BC_TRANSACTION
BC_REPLY
用于处理客户与服务器交互
总结
1,ioctl用与操作Binder驱动
网友评论