Binder是一种进程间通信(IPC)机制,提供了远程过程调用(RPC)功能,对于Server进程,Binder指的是Binder本地对象,对于Client则是指Binder代理对象,他只是Binder本地对象的一个远程代理,在传输过程中,Binder是可以进行跨进程传递的对象,Bidner驱动自动完成代理对象和本地对象的转换
Linux背景
Linux Keynel是操作系统的核心,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。出于安全考虑,将Kernel和上层的应用程序抽象的隔离,分为内核空间(Kernel Space)和用户空间(User Space)。
用户空间只能通过系统调用来访问内核空间,所有的资源访问都在内核的控制下执行,此时进程的状态称为内核态,而进程执行用户自己的代码时称为用户态。
传统的Linux通信机制(pipe,socket)都是内核支持的,但Binder并不是,他通过Binder驱动(是一个Linux的动态可加载模块)负责各个用户进程的Binder通信。
Binder通信
两个运行在用户空间的进程(Server和Client)需要在Binder驱动和SM(ServiceManager)的帮助下才能完成通信,基本的步骤为
- 进程先向Binder驱动申请建立SM(负责管理Service)
- Server在SM中注册,每个Server段启动后向SM报告,SM中就有了一张表,记录了Server的名字和地址等信息
- Client向Server通信时,先查询SM,通过SM得到地址,然后开始通信
其实Binder跨进程传输并没有真正的跨进程,而是通过代理的对象完成了跨进程通信,当Client向SM查询后,Binder驱动并不会向Client返回一个真正的object对象,而是一个代理对象objectProxy,他有着和object一样的方法,但并没有实现方法的能力,他只能将参数包装后传给Binder驱动,然后驱动通知Server进程,调用真正的object对象的方法然后将结果发送给Binder驱动,最后发送给Client
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 3049155267@qq.com