Binder学习笔记
2020-03-18 本文已影响0人
heheworld
其实也不算学习笔记了,整理下几位大拿写的文章,自己回顾加深下印象
基础概念
- 进程隔离 为保证运行中的进程互不影响,设立该规则
- 内核空间 kernel , 我理解为系统空间
- 用户空间 用户程序运行区域。
- 系统调用 , 用户空间访问内核空间的唯一途径(什么用户程序都能操作系统,那肯定不行,得遵守一个规则)
- 内核态 内核运行态,进程在处理内核代码处理时候,CPU 特权 0级最高
- 用户态 用户运行态,进程处理用户代码时,CPU特权 3级。
- LKM Loadable Kernel Moudle, 动态可加载内核模块,可以单独编译,不能单独运行,通过该规则可以链接一个模块到内核,做为内核的一部分运行在内核空间,而Binder 就是
- Binder 基于LKM机制,运行在内核空间,用户进程通过该模块,实现了进程间通信。
Binder 相较其他进程间通信的优势,
- 性能,linux进程间通信 需要两次内存拷贝,copy_from_user,copy_to_user;而Binder 只需要一次。
大概是这样的流程,在内核空间 开辟了内核缓存区,接收方缓存区,发送方(A)的数据拷贝到(内核缓存区),然后将内核缓存区的做一次映射(mmap)到接收方缓存区,然后接收方缓存区和接收方(B)之间也有一个内存映射,这样
A方发送的数据,B方能够接收到,从而完成了一次进程间通信。 - 安全
传统的进程通信方式对于通信双方的身份并没有做出严格的验证,只有在上层协议上进行架设,很容易被伪造攻击。
而Binder机制从协议本身就支持对通信双方做身份校检,因而大大提升了安全性。这个也是Android权限模型的基础。
Binder 通信过程简述
通信过程,主要有下列几个角色
- Client 客户端,发送请求的一方。
- Server 服务端,提供服务的一方。
- ServiceManager 服务管理方。
- Binder 驱动,我理解为中介。
大概流程,
- 首先一个进程通过Binder 申请成为ServiceManager。
- 其他新建的Server 通过Binder 在ServiceManager注册留名(地址)。
- Client 需要跟 Server通信时,会通过Binder ,在ServiceManager中查找对应的Server。
- 如果ServiceManager 中有需要的Server,会通过Binder返回一个Server的代理对象给Client。
**需要注意的是,
Client端取到的对象并不是真正的对象,而是一个代理对象。
ServiceManager,Server,Client 不在同一个进程,他们之间通信都是基于Binder的,而对应的Client拿到的对象其实都是代理对象。
**
Binder到底是什么呢
我觉得这篇文章总结的很好
关于binder的总结
我们经常提到Binder,那么Binder到底是什么呢?
Binder的设计采用了面向对象的思想,在Binder通信模型的四个角色里面;他们的代表都是“Binder”,这样,对于Binder通信的使用者而言,Server里面的Binder和Client里面的Binder没有什么不同,一个Binder对象就代表了所有,它不用关心实现的细节,甚至不用关心驱动以及SM的存在;这就是抽象。
通常意义下,Binder指的是一种通信机制;我们说AIDL使用Binder进行通信,指的就是Binder这种IPC机制。
对于Server进程来说,Binder指的是Binder本地对象
对于Client来说,Binder指的是Binder代理对象,它只是Binder本地对象的一个远程代理;对这个Binder代理对象的操作,会通过驱动最终转发到Binder本地对象上去完成;对于一个拥有Binder对象的使用者而言,它无须关心这是一个Binder代理对象还是Binder本地对象;对于代理对象的操作和对本地对象的操作对它来说没有区别。
对于传输过程而言,Binder是可以进行跨进程传递的对象;Binder驱动会对具有跨进程传递能力的对象做特殊处理:自动完成代理对象和本地对象的转换。
总结的差不多了,其实我觉得关于过往的知识点,每次去回顾的时候,认识会更深入一点,同时也可能会与新学习到的知识有关联,渐渐的有‘窥一斑而知全豹’的感觉,古人常说的‘温故而知新’,大概就是如此吧。