1. 传统Linux IPC机制的缺点
1.1 性能角度
管道、消息队列、Socket实现一次进程通信都需要2次内存拷贝,效率太低;
共享内存虽然不需要拷贝内存,但管理复杂;
Binder只需要一次内存拷贝,从性能角度来看,低于共享内存方式,优于其它方式。
IPC | 数据拷贝次数 |
share mm | 0 |
Binder | 1 |
pipe MQ SOCKET | 2 |
2.2 安全性考虑
a. 传统的IPC机制没有安全措施,接收方无法获得对方可靠的进程ID或用户ID,比如Socket通信的IP地址是客户端填入的,很可能被恶意程序篡改。
b. Android作为面向终端用户的开源平台,因此安全性极为重要。Android系统为每个已安装的App都分配了用户ID(UID),UID是鉴别进程身份的重要标识,通过UID可以进行一系列的权限校验。
c. 传统IPC的接入点是开放的,任何程序都可以根据协议进行访问,无法阻止恶意程序的访问。
综上所述:
Android需要一种基于C/S架构的IPC机制,Server端需要能够对Client的请求进行身份校验,来保证数据的安全性。
Binder驱动是一种虚拟的字符设备,注册在/dev/binder中,其定义了一套Binder通信协议,负责建立进程间的Binder通信,提供了数据包在进程之间传递的一系列底层支持。应用进程访问Binder驱动也是通过系统调用实现。
2、Binder的基本原理
Binder借助了内存映射(mmap)的方法,在内核空间和接收方用户空间的数据缓存区之间做了一层内存映射。从发送方用户空间拷贝到内核空间缓存区的数据,就相当于直接拷贝到了接收方用户空间的数据缓存区,从而减少了一次数据拷贝。
(未完待续)