理解Android系统Binder机制

2019-12-10 18:02:32于海丽

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驱动部分。实现功能如下: