跟着卷卷龙一起学 Camera--Binder
Binder 是 Android 系统提供的一种 IPC(进程间通信)机制。为了完成进程间的通信,binder 使用 AIDL 来描述进程间的接口。
进程间通信原理
对于用户空间,不同进程之间彼此是不能共享的,而内核空间却是可共享的。
\
Binder 原理
Binder 通信采用 C/S 架构,从组件视角来说,包含 Client、Server、ServiceManager 以及 binder 驱动。
\
Binder 通信模型
接收端进程开启一个专门的线程,通过系统调用在 binder 驱动(内核)中先注册此进程(创建保存一个 bidner_proc),驱动为接收端进程创建一个任务队列(biner_proc.todo)
接收端线程开始无限循环,通过系统调用不停访问 binder 驱动,如果该进程对应的任务队列有任务则返回处理,否则阻塞该线程直到有新任务入队
发送端也通过系统调用访问,找到目标进程,将任务丢到目标进程的队列中,然后唤醒目标进程中休眠的线程处理该任务,即完成通讯
\
Binder 内存转移关系
Binder 单次通信只需要进行一次拷贝,因为它使用了内存映射,将一块物理内存(若干个物理页)分别映射到接收端用户空间和内核空间,达到用户空间和内核空间共享数据的目的。
发送端要向接收端发送数据时,内核直接通过 copy_from_user 将数据拷贝到内核空间映射区,此时由于共享物理内存,接收进程的内存映射区也就能拿到该数据了。
\
Binder 套件架构
内核层的 Binder 驱动已经提供了 IPC 功能,不过还需要在 framework native 层提供一些对于驱动层的调用封装,使 framework 开发者更易于使用,由此封装出了 native Binder;同时,由于 framework native 层是 c/c++语言实现,对于应用开发者,需要更加方便的 Java 层的封装,衍生出 Java Binder;最后在此之上,为了减少重复代码的编写和规范接口,在 Java Binder 的基础上又封装出了 AIDL。经过层层封装,在使用者使用 AIDL 时对于 Binder 基本上是无感知的。
版权声明: 本文为 InfoQ 作者【卷卷龙】的原创文章。
原文链接:【http://xie.infoq.cn/article/c437e2f8297db69f8fd090f42】。文章转载请联系作者。
评论