Binder原理

学习自

https://www.jianshu.com/p/04a034cbbc27 binder简单理解

https://blog.youkuaiyun.com/boyupeng/article/details/47011383 binder教科书

https://www.jianshu.com/p/adaa1a39a274 binder问题大全

 

为什么要用binder:

1.单次拷贝->效率翻倍

2.传统IPC是往数据包里填充UID/PID,不安全;Binder直接使用应用UID/PID

 

如果要实现IPC,需要解决那些问题:

1.定位到进程、方法

通过包名可以定义到进程(因为PMS做好了解析),再定位类,再定位方法,方法的话无法直接定位,不过给他制定一个编码即可

2.如何把方法参数发送到远程,并把方法结果从远程发送回来

发送细节暂不讨论。方法参数都是对象,自然无法跨进程被使用,所以需要序列化,然后在远程进行一次反序列化,这样就通过一次拷贝成功地把对象在拷贝了一份了。

 

一图以蔽之,发送方法参数,拿到方法运行结果。

 

系统服务的注册

Android开机的时候,各种Service会被创建,并注册到ServiceManager中去。

我们可以从ServiceManager中找到对应的服务,但是3、4才是真正的binder过程。

 

但是我们客户端还会持有远程端的方法,集成自IBinder,这些是干什么用的呢?

客户端的Binder是用来匹配远程服务端的方法的。会先序列化方法参数,本地Binder会调用transact,把方法参数和方法标识,经过Binder驱动传递到服务端的共享内存里,经过了一次反序列化,然后服务端Binder调用onTransact,找到对应方法,拿到方法参数,执行方法,执行完后,把方法结果序列化,再经过Binder驱动传递到客户端的共享内存里,再经过一次反序列化。

 

传统IPC数据是怎么从客户端到服务端的呢?

客户端——>Linux内核——>服务端,要经过两次数据的拷贝。

1.多次拷贝性能低

2.没有一个中间人,服务端不知道要开辟多大的缓存区,内存浪费

所以有了Binder驱动,他来创建接受者的缓冲区。

 

两个用户空间之间是不能直接通信的,Binder是怎么“绕过”内核空间,从而实现的只需1次拷贝呢?

进程B中,由于Binder的mmap方法,使得用户空间和内核空间的虚拟内存映射到了同一块物理内存,所以用户空间就可以访问内核空间的数据了。

Binder驱动是会把A的用户空间的内容直接拷贝到B的内核空间中去的,B的用户空间又是和内核空间直接共享的,所以这样就实现了一次拷贝便可使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值