Binder复习
涉及的Linux知识
进程隔离
进程隔离是为保护操作系统中进程互不干扰而设计的一组不同硬件和软件的技术。这个技术是为了避免进程A写入进程B的情况发生。 进程的隔离实现,使用了虚拟地址空间。进程A的虚拟地址和进程B的虚拟地址不同,这样就防止进程A将数据信息写入进程B。
用户空间/内核空间
用户空间就是上层应用程序可以访问的一些被许可的内存空间。
内核空间就是Kernel可以访问受保护的内存空间。同时Kernel也可以访问底层硬件设备。
系统调用/用户态/内核态
用户空间访问内核空间的唯一方式就是系统调用。
当进程在执行用户自己的代码时,我们称该进程处于用户运行态(简称用户态)。
当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称该进程处于内核运行态(简称内核态)。
内核模块/驱动
内核模块有独立的功能,可以被单独编译,但不能独立运行。
Linux
系统可以动态加载内核模块,链接模块到内核中。该模块作为内核的一部分在内核空间中运行。用户进程之间可以通过这个内核模块作为桥梁相互通信。
驱动是操作硬件设备的唯一接口。为了支持
Binder
通信,Binder
通信内核模块使用了一种"硬件",因此这个模块叫做Binder驱动。
Binder是什么
Binder
是高性能、高安全的跨进程通信机制。这个也是Android
权限模块的基础。
Binder如何跨进程通信
Client
进程、Server
进程、ServiceManager
(类似通讯录,可注册和查询)、Binder
驱动(运行于内核中,类似基站,可传达信息)。
一个进程向驱动申请成为
SM
,之后SM
进程负责管理Service
。
每个
Server
端进程启动后,向SM
请求注册信息,Client
端想要与Server
端通信,首先向SM
请求查询Server
端通信信息,收到信息后开始通信。
Client
与SM
,Client
与Server
通信都会经过Binder
驱动,它是进程间通信的桥梁。
Binder机制跨进程原理
传统进程间通信机制是这么做的:
Kernel
可以访问Client
和Server
进程的所有数据,那么通过内核做中转,先通过系统调用copy_from_user
把Client
的数据copy
到内核空间,然后再通过系统调用copy_to_user
把数据copy
到Server
就完成了。
Client
端向SM
查询Server
端中的Object
时,进程间通信的数据都会经过运行在内核空间中的驱动,驱动会对该数据做一些处理,它并不会给Client
端返回一个真正的Object
,而是返回一个看起来一模一样的ObjectProxy
,但是这个对象里没有Server
端中Object
对象的能力。
Server进程向SM进行注册时也是跨进程通信,驱动也会对这个过程进行
处理。其实SM中存在的Server端的对象实际上也是代理对象,Client端向SM查询时,驱动会返回给Client另一个代理对象。Server进程本地对象只有一个,其它进程所拥有的全部都是它的代理。
Java层的Binder
对于Client端而言,Binder指的是Binder代理对象,对于这个Binder代理对象的操作会通过驱动最终转发到Binder本地对象上;对于Server端而言,Binder指的是Binder本地对象;对于传输过程而言,Binder是可以跨进程传递的对象,Binder驱动会对该对象进行特殊处理,自动完成代理对象和本地对象的转换。
IBinder是一个接口,代表一种跨进程传输的能力。在跨进程数据流经Binder驱动的时候,会从Binder本地对象转换位Binder代理对象。IInterface代表的是远程Server端拥有的具体的能力,详细来说就是aidl里面的接口具有的能力。BinderProxy是Binder类的一个内部类,代表远程Server端的Binder对象的本地代理。Stub是在使用AIDL的时候,编译工具为我们生产的一个Stub的静态内部类,这个类继承了Binder且实现了IInterface接口,代表它具有Server端承诺给Client端的能力。Stub是一个抽象类,具体的实现需要我们手动完成,这是一种策略模式。
驱动层的Binder
Binder对象跨进程传递的时候,Binder驱动会自动完成两种类型的转换,因此Binder驱动必然保存了每一个跨进程的Binder对象的相关信息。在驱动中,Binder本地对象的代表是一个叫做
binder_node
的数据结构,Binder代理对象是用binder_ref
代表的。有的地方把Binder本地对象直接称作Binder实体,把Binder代理对象直接称作Binder引用(句柄),其实指的都是Binder对象在驱动里面的表现形式。
手写Binder完成跨进程通信
TODO