写点什么

跟着卷卷龙一起学 Camera--Binder

作者:卷卷龙
  • 2022 年 9 月 15 日
    上海
  • 本文字数:726 字

    阅读完需:约 2 分钟

Binder 是 Android 系统提供的一种 IPC(进程间通信)机制。为了完成进程间的通信,binder 使用 AIDL 来描述进程间的接口。

进程间通信原理



对于用户空间,不同进程之间彼此是不能共享的,而内核空间却是可共享的。

\

Binder 原理



Binder 通信采用 C/S 架构,从组件视角来说,包含 Client、Server、ServiceManager 以及 binder 驱动。

\

Binder 通信模型



  1. 接收端进程开启一个专门的线程,通过系统调用在 binder 驱动(内核)中先注册此进程(创建保存一个 bidner_proc),驱动为接收端进程创建一个任务队列(biner_proc.todo)

  2. 接收端线程开始无限循环,通过系统调用不停访问 binder 驱动,如果该进程对应的任务队列有任务则返回处理,否则阻塞该线程直到有新任务入队

  3. 发送端也通过系统调用访问,找到目标进程,将任务丢到目标进程的队列中,然后唤醒目标进程中休眠的线程处理该任务,即完成通讯

\

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 基本上是无感知的。


发布于: 2022 年 09 月 15 日阅读数: 43
用户头像

卷卷龙

关注

还未添加个人签名 2022.07.26 加入

还未添加个人简介

评论

发布
暂无评论
跟着卷卷龙一起学Camera--Binder_ISP_卷卷龙_InfoQ写作社区