为什么android要在linux内核中引入binder?

问题描述 投票:0回答:1

我正在尝试学习Android(Linux)内核,并且我知道Android需要非常快(零拷贝)的IPC,但是我仍然不明白为什么需要存在binder。

可以使用 Unix 套接字并映射

/dev/shm
文件来完成同样的事情吗?

假设使用 dbus,但要实现零复制,请在 tmpfs 中创建并打开文件(例如

/dev/shm
)删除它(这样另一个进程可能会意外打开它),将文件描述符发送到其他进程并映射它。

编辑: 您也可以使用

shm_open
,而不是在 tmpfs 中创建文件

android linux performance linux-kernel android-kernel
1个回答
0
投票

创建Binder新机制主要有三个原因

  1. 复杂性
  2. 性能
  3. 安全

复杂性——在智能手机平台,尤其是Android系统中,为了给应用程序开发者提供多种功能,这种通信方式无处不在,比如媒体播放、视频和音频捕获以及让手机变得更加智能的各种传感器(加速度、方向、温度、亮度等)都由不同的Server管理,应用程序只有作为Client与这些Server建立连接才能使用这些服务

示例:MediaPlayBack - 媒体播放、视频和音频捕获以及使手机变得更智能的各种传感器(加速度、方向、温度、亮度等)都由不同的 Server 管理,应用程序只需建立作为客户端与这些服务器的连接。开发令人眼花缭乱的功能需要花费一点时间和精力。客户端-服务器方式的广泛采用对进程间通信(IPC)机制提出了挑战

性能——socket作为通用接口,传输效率低,开销大。主要用于跨网络的进程间通信以及机器上进程间的低速通信。 消息队列和管道采用存储转发方式,即先将数据从发送方缓冲区复制到内核开辟的缓冲区,然后再从内核缓冲区复制到接收方缓冲区。至少有两个复制过程。共享内存虽然不需要复制,但是控制复杂,使用困难。

安全——Android作为一个拥有众多开发者的开放平台,来源广泛,因此保证智能终端的安全性非常重要。传统IPC没有任何安全措施,完全依靠上层协议来保证。首先,传统IPC的接收方无法获取对方进程可靠的UID/PID(用户ID/进程ID),因此无法识别对方身份。

Android为每个安装的应用程序分配自己的UID,因此进程的UID是识别进程身份的重要标志。使用传统的IPC,只有用户可以在数据包中填写UID/PID,但这不可靠且容易被恶意程序利用。

其次,传统IPC接入点是开放的,无法建立私有通道。

基于以上原因,Android需要建立一种新的IPC机制来满足系统对通信方式、传输性能和安全性的要求,这就是Binder

© www.soinside.com 2019 - 2024. All rights reserved.