|
|
|
@ -1,5 +1,5 @@ |
|
|
|
|
--- |
|
|
|
|
Binder 设备文件 |
|
|
|
|
Binder 设备文件的初始化、打开和内存映射过程 |
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
#### 初始化过程 |
|
|
|
@ -18,4 +18,10 @@ Binder 设备的初始化过程是在 Binder 驱动程序的初始化函数 bind |
|
|
|
|
|
|
|
|
|
进程打开了设备文件 /dev/binder 之后,还必须要调用函数 mmap 把这个设备文件映射到进程的地址空间,然后才可以使用 Binder 进程间通信机制。设备文件 /dev/binder 对应的是一个虚拟设备,将它映射到进程的地址空间的目的并不是对它的内容感兴趣,而是为了为进程分配内核缓冲区,以便它可以用来传输进程间通信数据。 |
|
|
|
|
|
|
|
|
|
当进程调用函数 mmap 将设备文件 /dev/binder 映射到自己的地址空间时,Binder 驱动程序中的函数 binder_mmap 就会被调用。 |
|
|
|
|
当进程调用函数 mmap 将设备文件 /dev/binder 映射到自己的地址空间时,Binder 驱动程序中的函数 binder_mmap 就会被调用。 |
|
|
|
|
|
|
|
|
|
Binder 驱动程序最多可以为进程分配 4M 内核缓冲区来传输进程间通信数据。Binder 驱动程序为进程分配的内核缓冲区在用户空间只可以读,而不可以写。 |
|
|
|
|
|
|
|
|
|
Binder 驱动程序为进程分配的内核缓冲区有两个地址,其中一个是用户空间地址,另一个是内核空间地址。进程通过用户空间地址来访问这块内核缓冲区的内容,而 Binder 驱动程序通过内核空间地址来访问这块内核缓冲区的内容。由于它们是连续的,并且起始地址相差一个固定值,因此,只要知道其中的一个地址,就可以方便的计算出另外一个地址。 |
|
|
|
|
|
|
|
|
|
Binder 驱动程序为进程分配的内核缓冲区即为一系列物理页面,它们分别被映射到进程的用户地址空间和内核地址空间。当 Binder 驱动程序需要将一块数据传输给一个进程时,它就可以先把这块数据保存在为该进程所分配的一块内核缓冲区中,然后再把这块内核缓冲区的用户空间地址告诉进程,最后进程就可以访问到里面的数据了。这样做的好处便是不需要将数据从内核空间复制到用户空间,从而提高了数据的传输效率。 |