Android系统Binder机制学习总结(2)

4.binder_ref_death。binder_ref_death是一个通知结构体。只要某进程订阅了某binder引用对应实体的死亡通知,那么binder驱动就会为该binder引用建立一个binder_ref_death通知结构体,将其保存在当前进程的对应binder引用结构体的death域中,即Binder引用对象将死亡通知注册到Binder驱动程序中。这里涉及到Binder的死亡通知机制,Binder的死亡通知机制具体指:如果Binder实体对象意外死亡,那么将会导致改Binder实体对象的引用变得无效,因而就需要在Binder实体对象死亡的时候通知到所有引用它的代理对象,从而在一定程度上预防和解决Binder饮用对象无效的问题;

5.binder_buffer。Binder_Buffer用于描述一个内核缓冲区,能够在进程之间传输数据;

6.binder_proc。binder_proc表示正在使用Binder进程通信机制的进程,能够保存调用Binder的各个进程或线程的信息,如线程ID、进程ID、Binder状态信息等;

7.binder_thread。binder_thread用于存储每一个单独的线程的信息,表示Binder线程池中的一个线程;

8.binder_transaction。binder_transaction用于中转请求和返回结果,并保存接收和要发送的进程信息;

9.binder_write_read。binder_write_read表示在进程之间的通信过程中传输的数据,数据包中有一个cmd域用于区分不同的请求;

10.BinderDriverCommandProtocol。结构体binder_write_read包含的命令在BinderDriverCommandProtocol中定义;

11.BinderDriverReturnProtocol。BinderDriverReturnProtocol中定义了读操作命令协议;

12.binder_ptr_cookie。binder_ptr_cookie表示一个Binder实体对象或Service组件的死亡接收通知;

13.binder_transaction_data。binder_transaction_data表示在通信过程中传递的数据;

14.flat_binder_object。flat_binder_object表示Binder对象。Android系统中,在进程之间传递的数据称为Binder对象。

六、Binder的详细实现。

1.设备初始化。Binder机制的设备初始化函数binder_init位于inder.c中,在进行设备初始化的时候binder_init会调用设备驱动接口函数device_initcall;

2.打开设备文件。Binder机制,函数binder_open用于打开Binder设备文件/dev/binder。Android系统中,驱动程序的任何一个进程及线程都可以打开一个Binder设备;与binder_open函数功能相反的是binder_release函数,用于释放打开的空间以及操作过程中分配的空间;

3.实现内存映射。当打开Binder设备文件/dev/binder之后,需要调用函数mmap()把设备内存映射到用户进程地址空间中,这样就可以像操作用户内存那样操作设备内存。在Binder设备中,对内存的映射操作是有限制的,如Binder不能映射具有写权限的内存区域,最大能映射4MB的内存区域等;

4.释放物理页面。Binder机制中,函数binder_insert_free_buffer()用于将进程中的Buffer插入进程信息中,即将一个空闲内核缓冲区加入进程中的空闲内核缓冲区的红黑树中;

5.处理内核缓冲区:

①*binder_alloc_buf()用于分配内核缓冲区;

②binder_insert_allocated_buffer()用于将分配的内核缓冲区添加到目标进程的已分配物理页面的内核缓冲区红黑树中;

③binder_free_buf()用于释放内核缓冲区的操作;

④*buffer_start_page()和*buffer_end_page()用于计算结构体binder_buffer所占用的虚拟页面的地址;

⑤binder_delete_free_buffer()用于删除结构体binder_buffer;

⑥*binder_buffer_lookup()根据一个用户空间地址查询一个内核缓冲区。

七、Binder封装库

Android源码中,各个层次都有Binder的相关实现,其中主要由本地原生代码实现,其它层次的Binder实现都是调用原生Binder库来实现的。

Binder的各层次实现为:

1.Binder驱动部分。实现功能如下:

①组织Binder的服务及诶到哪;

②调用Binder相关的处理线程;

③完成实际的Binder传输。

2.Binder Adapter层。Binder Adapter层是对Binder驱动的封装,主要功能是操作Binder驱动,因而应用程序无须直接和Binder驱动程序关联。关联文件包括IPCThreadState.cpp、ProcessState.cpp和Parcel.cpp中的一些内容。Binder核心库是Binder框架的核心实现,主要包括IBinder、Binder(服务端)和BpBinder(客户端)。

3.顶层。顶层binder框架和具体的客户端。

三层结构如图:

Android系统Binder机制学习总结

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/515dd0bc4ba834f867ff770f1206bf4f.html