Binder 是 android 给予 linux 系统实现的跨进程通信的一种机制。
为什么不用 Linux 自带的跨进程通信方式
- 1.Binder 机制的效率更高
- 2.传统的跨进程通信方式,比如说管道通信,socket,并没有对通信双方的身份进行严格验证。比如过 socket 可以自己拟定 ip。而 Binder 机制从协议本身就支持对通信双方做身份校检,因而大大提升了安全性。这个也是 Android 权限模型的基础。
为什么要进行跨进程通信
那是因为操作系统的进程之间是相互隔离的(进程隔离),有一句形象的话是这样说的:‘每个进程都天真的以为自己独享了整个系统,而感知不到其他的进程’。所以要进行进程之间的信息交互必须依赖一种系统机制。
用户空间–系统调用–内核空间
Linux Kernel 是操作系统的核心,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。
所以不是所有的应用程序都可以调用或访问 Kernel,所以要把 kernel 和上层应用区分开,分为 Kernel Space(内核空间)和 User Space(用户空间)。
如果用户空间想要访问被保护的内存,那么可以通过系统调用。当一个进程执行系统调用的时候,进程就处于内核运行态(内核态),这时候处理器处于特权最高的内核代码中运行,当进程执行自己的代码的时候处于用户运行态(用户态),这时候处理器处于特权最低用户用户代码中执行。
Binder 驱动
用户空间访问用户空间要通过内核的支持,但是 Binder 并不是系统的内核,linux 提供了一种可动态添加内核模块的机制,加载 Binder 驱动,这种动态添加的模块可以独立编译,但是不能独立运行。
Binder 中的四种类型
- 1.SM(ServiceManager)注册 server
- 2.server 提供 binder 对象
- 3.Binder 驱动 将 binder 对象转换成 binder 代理对象,实现进程间通信
- 4.client 获取 binder 代理对象
注:其实 SM 注册的时候也是使用了进程间通信,SM 获取的也是 binder 代理。
使用代理方法的时候其实会最终调用 binder 对象的方法。


