Binder
在理解Binder机制之前,需要知道Binder是做什么的,在进程之间通信称作IPC,那么Binder是进程通信的一种解决方案,因此是具有跨进程通信能力。
进程间通信
- 管道
- 信号量
- Sokets
- 共享内存
- Binder
Binder与传统的IPC对比:
Binder | 共享内存 | Socket | |
---|---|---|---|
性能 | 拷贝一次 | 无需拷贝 | 拷贝俩次 |
特点 | 基于C/S架构,易用性高 | 控制复杂 | 基于C/S架构,效率低,开销大 |
安全性 | 为每个App分配UID,支持实名和匿名 | 依赖上层协议,访问接入点是开放不安全 | 依赖上层协议,接入点是开放不安全 |
引入内存划分的概念,分为俩种:
- 用户空间:程序代码运行的地方
- 内核空间:内存代码运行的地方
为了保证安全它们之间是隔离的,即使用户的程序崩溃,内核也不受影响
传统IPC传输数据通信
- 发送数据
- 通过系统调用 copy_from_user 将数据从用户空间 copy 到内核缓存区【1次copy】
- 通过系统调用 copy_to_user 将数据从内核空间 copy 到用户空间【2次 copy】
- 接收数据
Binder传输数据
Client / Service 架构中
Clent
FrameWork:ServiceManagerProxy 持有了 BinderProxy
Native:BpServiceManager 中的 BpBinder
驱动Dve
Service
BnServiceManager:BBinder
ServiceMagerNative:Binder
通信步骤:
- Binder驱动在内核空间创建一个数据接收缓存区
- 建立内核缓存区和数据接收缓存区之间的映射MMAP
- 发送进程通过copy_from_user函数把数据拷贝到内核缓存区中。
- 相当与拷贝到内核缓存边映射到接收进程的用户空间Dev