Binder简单介绍

什么是Binder

为了保护进程空间不被别的进程破坏或者干扰,Linux中的进程是相互独立的,也就是所谓的进程隔离。而且一个进程的内存空间还被分为了用户空间内核空间,二者也是相互隔离的。

  • 用户空间:数据不可共享,所以用户空间 = 不可共享空间
  • 内核空间:数据可共享,所以内核空间 = 可共享空间
  • 所有进程共用1个内核空间,也就是我们操作系统中的内核空间,在一个操作系统上的所有应用程序都会共用这么一个内核空间

也就是说为了安全和独立,一个进程是不能直接操作或者访问另外一个进程的内存空间的。他们之间既然是隔离的,在需要通信、协作的时候就需要使用进程间通信技术(即IPC,也称跨进程通信),而Binder就是一种IPC的方式。

传统通信的示意图

1.copy_from_user(): 将用户空间的数据拷贝到内核空间
2.copy_to_user(): 将内核空间的数据拷贝到用户空间
在这里插入图片描述

Binder通信的示意图

在这里插入图片描述

三者之间的交互

在这里插入图片描述

Binder驱动实现原理

服务端跨进程的类都要继承Binder类。我们所持有的Binder引用(即服务端的类引用)并不是实际真实的远程Binder对象,我们的引用在Binder驱动里还要做一次映射。也就是说,设备驱动根据我们的引用对象找到对应的远程进程。客户端要调用远程对象函数时,只需把数据写入到Parcel,在调用所持有的Binder引用的transact()函数,transact函数执行过程中会把参数、标识符(标记远程对象及其函数)等数据放入到Client的共享内存,Binder驱动从Client的共享内存中读取数据,根据这些数据找到对应的远程进程的共享内存,把数据拷贝到远程进程的共享内存中,并通知远程进程执行onTransact()函数,这个函数也是属于Binder类。远程进程Binder对象执行完成后,将得到的写入自己的共享内存中,Binder驱动再将远程进程的共享内存数据拷贝到客户端的共享内存,并唤醒客户端线程。

代码执行过程(Binder)在这里插入图片描述

优点

在这里插入图片描述

https://blog.csdn.net/weixin_39460667/article/details/82916441
https://blog.csdn.net/qq_23191031/article/details/60145022

猜你喜欢

转载自blog.csdn.net/weixin_37418246/article/details/83001630