基础知识
-
进程隔离:
进程隔离是为保护操作系统中进程互不干扰而设计的一组不同硬件和软件的技术。
这个技术是为了避免进程A写入进程B的情况发生。
进程的隔离实现,使用了虚拟地址空间。进程A的虚拟地址和进程B的虚拟地址不同,这样就防止进程A将数据信息写入进程B。 -
用户空间&内核空间
在操作系统中,虚拟内存被分为:用户空间 与 核心空间。
内核空间:内核、核心扩充(kernel extensions)、以及驱动程序,运行在核心空间上。
用户空间:其他的应用程序,则运行在用户空间上。 -
系统调用&内核态&用户态
1:系统调用:用户空间访问内核空间的唯一方式就是 系统调用;通过这个统一入口接口,所有的资源访问都是在内核的控制下执行,以免导致对用户 程序对系统资源的越权访问,从而保障了系统的安全和稳定。
2:内核态&用户态:当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)此时处理器处于特 权级最高的(0级)内核代码中执行。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。 -
Binder驱动
传统的IPC方式(管道,Socket等)是内核支持的,是可以直接访问 内核空间的 ,但是Binder并不是Linux内核的一部分,它是通过“Linux的动态可加载内核模块(Loadable Kernel Module,LKM)机制”解决了这个问题。
模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行。这样,Android系统可以通过添加一个内核模块运行在内核空间,用户进程之间的通过这个模块作为桥梁,就可以完成通信了。
在Android系统中,这个运行在内核空间的,负责各个用户进程通过Binder通信的内核模块叫做Binder驱动。
Binder是什么?
1:通常意义下,Binder指的是一种通信机制;我们说AIDL使用Binder进行通信,指的就是Binder这种IPC机制。
2:对于Server进程来说,Binder指的是Binder本地对象
3:对于Client来说,Binder指的是Binder代理对象,它只是Binder本地对象的一个远程代理;对这个Binder代理对象的操作,会通过驱动最终转发到Binder本地对象上去完成;对于一个拥有Binder对象的使用者而言,它无须关心这是一个Binder代理对象还是Binder本地对象;对于代理对象的操作和对本地对象的操作对它来说没有区别。
4:对于传输过程而言,Binder是可以进行跨进程传递的对象;Binder驱动会对具有跨进程传递能力的对象做特殊处理:自动完成代理对象和本地对象的转换。
Binder相较于 其它的方式有哪些优势?
- 性能:socket作为一款通用接口,其传输效率低,开销大,主要用在跨网络的进程间通信和本机上进程间的低速通信。消息队列和管道采用存储-转发方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程。共享内存虽然无需拷贝,但控制复杂,难以使用。
- 安全:传统的IPC方式没有严格的安全措施。
比如Socket,IP地址可以由客户端手动填入,调用者的身份很容易进行伪造。
而Binder机制从协议本身就支持对通信双方做身份校检,因为Android会为每个已安装的应用程序添加属于自己的UID,Binder 基于此会根据请求 端的UID来鉴别调用者的身份,保障了安全性。
Binder通信原理是怎么样的,怎么通信的?
- Server端进程向 ServiceManager注册,告诉它我是干嘛的,我具备什么能力。
- Client端进程通过Binder驱动向ServiceManager发出消息,说我想要调用Server进程的某一个方法获取数据。
- ServiceManager通过查找它所维护的所有Server进程信息,找到Cliecnt想要访问的那个Server端,并告诉相应的Server端执行XX方法并把返回值告诉我。
- 等Server执行方法完毕并把结果返回给ServiceManager之后,ServiceManager再通过Binder驱动把数据返回给Cliecnt进程。
网友评论