02 binder理论基础(下)

0

02 binder理论基础(下)

《binder理论基础(上)》中我们介绍了linux中常见的进程通信机制,下面我们来分析binder驱动采用的linux通信机制,以及选择的背后原因。

binder实现原理

binder的实现原理其实就是linux中的内存映射,内存映射 与mmap 其实说的是同一个东西,mmap 也就是memory map 的缩写。

前文我们讲过,内存映射是指inux中虚拟内存与实际物理内存由内存控制管理单元MMU建立的一 一对应关系。

file

mmap是linux 中申请大块内存或文件映射常用的高效的系统调用。

以文件映射为例:当我们进程访问文件数据的时候拿到的是虚拟内存地址,文件数据根据大小到物理内存中,当我们通过虚拟地址访问数据发现并没有对应的物理页或者对应的物理页为空,则发生缺页异常,此时会把数据从文件中拷贝到物理内存中。整个过程仅发生一次拷贝,因此拷贝的效率以及需要的缓存空间都要优于其他数据传递方式。

file

内存映射不仅仅是物理内存和虚拟内存之间的映射,还包括将文件中的内容映射到虚拟内存空间。通过mmap内存映射,访问内存空间就能够访问到文件里面的数据,对该段内存空间的读写也会同步到文件中。

file

除了文件数据的内存映射,不同进程之间也可以进行内存映射。

常规的进程之间数据传递,都需要通过内核空间的系统调用来完成,先把数据从数据来源进程拷贝到内核空间的数据缓冲区,然后再把数据拷到目标进程中,一共需要两次拷贝。

file

file

而内存映射,以文件映射为例:当我们进程访问文件数据的时候拿到的是虚拟内存地址,文件数据根据大小到物理内存中,当我们通过虚拟地址访问数据发现并没有对应的物理页或者对应的物理页为空,则发生缺页异常,此时会把数据从文件中拷贝到物理内存中。整个过程仅发生一次拷贝,因此拷贝的效率以及需要的缓存空间都要优于其他数据传递方式。

基于此原理,不同进程通过映射同一段内存,可以实现高效的不同进程之间的数据同步,也就是binder机制的底层原理。

总结

  1. 架构:Binder本身的C/S架构模型,很适合Android系统的通信架构
  2. 性能:管道,消息队列,Socket的通讯都需要两次数据拷贝,而Binder只需要一次。要知道,对于系统底层的IPC形式,少一次数据拷贝,对整体性能的影响是非常之大的
  3. 安全性:传统IPC形式,无法得到对方的身份标识(UID/GID),而在使用Binder IPC时,这些身份标示是跟随调用过程而自动传递的。Server端很容易就可以知道Client端的身份,非常便于做安全检查。至于这个安全性的体现我们后面文章会讲到。