Binder入门

版权声明:有些文章写的很随意,那是仅作为个人记录的文章,建议直接关掉,多看一秒亏一秒 https://blog.csdn.net/qq_36523667/article/details/82145300

最近打算深入学习下Binder,本文先记录下以前学习的基础

本文学习自

http://gityuan.com/2015/10/31/binder-prepare/

大体原理

A进程有一个Binder对象,它是B进程某对象的代理类。调用Binder对象方法的时候,我们会把方法参数序列化,通过Binder驱动,把序列化的产物拷贝一次,然后在B进程进行反序列化。然后开始执行B进程的方法,B进程的方法执行完后,方法返回值也是类似的处理。

为何只需要1次拷贝

正常手段是A的用户空间->A的内核空间->B的内核空间->B的用户空间。其中用户空间到内核空间的转换是需要进行1次拷贝的,因为用户空间和内核空间的内存空间是独立的。Binder驱动通过mmap函数,把B的用户空间和B的内核空间映射到同一块内存中去,Binder驱动会被序列化产物运输到这块内存中去,所以只需要1次拷贝。

为何选用Binder

1.仅1次拷贝,性能翻倍

2.安全。以往都是用户主动往数据包里填充UID/PID等信息,现在由Binder驱动自主获取,保障了通信双方的身份安全。

下面是链接里的内容

这个图很好的表示了上面的原理

ioctl:这是真的把Binder作为一个驱动在用。ioctl就是驱动和内存进行交互的一个函数。

ServiceManager其实不算Binder系统的一部分,只是Binder系统的使用者。他存放了各大服务的Binder对象,client会通过ServiceManger的Binder拿到各大服务的Binder。ServiceManager的存在,是C/S架构的体现。

猜你喜欢

转载自blog.csdn.net/qq_36523667/article/details/82145300