理解 Binder 机制

以下文章参考 https://zhuanlan.zhihu.com/p/35519585,《Android艺术开发探索》

首先像声明,Binder 的复杂程度肯定不是一篇文章能说清楚的,之所以写这篇文章,是在博客,书上学习到后,能让自己有一个概念,希望深入理解 Binder 的可以自行参考网上文章。

什么是 Binder?

我的理解就是:是一种进程间的通讯机制

为什么是 Binder?

大家都知道,Android 是基于 Linux 内核开发的,Linux 本身就提供了多种进程间通讯的机制,如管道(Pipe)、信号(Signal)、消息队列(Message)、共享内存(Share Memory)和 Socket 等
原因
其他通信方式存在 安全性,性能等问题

性能
Socket 作为一款通用接口,其传输效率低,开销大,主要用在跨网络的进程间通信和本机上进程间的低速通信。消息队列和管道采用存储-转发方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程。共享内存虽然无需拷贝,但控制复杂,难以使用。Binder 只需要一次数据拷贝,性能上仅次于共享内存。

进程间通讯方式 拷贝次数
管道 2
消息队列 2
Socket 2
Binner 1
共享内存 0

安全性
传统 IPC 接收方无法获得对方可靠的进程用户ID/进程ID(UID/PID),从而无法鉴别身份,而Binder机制为每个进程分配了UID/PID且在Binder通信时会根据UID/PID进行身份鉴别

基本的跨进程概念

  • 进程隔离
    进程与进程间内存是不共享的
  • 进程空间划分:用户空间(User Space)/内核空间(Kernel Space)
    内核空间(Kernel)是系统内核运行的空间,用户空间(User Space)是用户程序运行的空间。为了保证安全性,它们之间是隔离的。
  • 系统调用:用户态/内核态
    当一个任务(进程)执行系统调用而陷入内核代码中执行时,称进程处于内核运行态(内核态)
    当进程在执行用户自己的代码的时候,我们称其处于用户运行态(用户态)
    系统调用主要通过如下两个函数来实现:
    copy_from_user() :将数据从用户空间拷贝到内核空间
    copy_to_user() :将数据从内核空间拷贝到用户空间
image

传统IPC原理

  • 发送方将要发送数据的放在用户空间内存缓存区
  • 调用 copyfromuser() 函数将数据从用户空间的内存缓存区拷贝到内核空间的内核缓存区中
  • 接收方进程在接收数据时在自己的用户空间开辟一块内存缓存区
  • 内核程序调用 copytouser() 函数将数据从内核缓存区拷贝到接收进程的内存缓存区


    image

Binder IPC 底层通讯原理

IPC 过程

  • Binder 驱动创建一块数据接收缓存区
  • 在内核空间开辟一块内核缓存区,建立内核缓存区和内核中数据接收缓存区之间的映射关系,以及内核中数据接收缓存区和接收进程用户空间地址的映射关系;
  • 发送方进程通过系统调用 copyfromuser() 将数据 copy 到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射,因此也就相当于把数据发送到了接收进程的用户空间,这样便完成了一次进程间的通信。


    image

Binder 实现层
首先我们应该知道 Binder 是 C/S 架构,他的组成主要有 ClientServerServiceManager, Binder 驱动 ,其中 ClientServerServiceManager 是运行在 用户空间层,而 Binder 驱动 自然是内核层了。

无标题.png

通信过程

  • 首先,一个进程使用 BINDERSETCONTEXT_MGR 命令通过 Binder 驱动将自己注册成为 ServiceManager
  • Server 向 Service Manager 中注册 Binder (Server 中的 Binder 实体)表明可以对外提供服务
  • Client 向 Service Manager 获取到对Binder 实体的引用
  • 通过这个引用实现 Client 和 Server 的进程通信

Binder 通信中的代理模式
由上面我们知道了 跨进程通信是借住了 Binder 驱动完成的,由于 Client 和 Server 是两个不同的进程,当 Client 想要 Server 某个对象的话,是没办法直接使用的。所以既然跨进程是借住 Binder 驱动 完成的,因此在数据经过 Binder 驱动的时候驱动会对数据进行一层转换,当 A 进程想要获取 B 进程的 object 时,驱动并不会把真正的 object 返回给 A ,而是返回一个跟 object 看起来一模一样的代理对象 objectProxy ,这个 objectProxy 具有和 object 一摸一样的方法,但是这些方法并没有 B 进程中 object 对象那些方法的能力,这些方法只需要把请求参数交给驱动即可。对于 A 进程来说和直接调用 object 中的方法是一样的。

image

Binder 的定义
现在我们可以对 Binder 做个更加全面的定义了:

  • 从进程间通信的角度看,Binder 是一种进程间通信的机制;
  • 从 Server 进程的角度看,Binder 指的是 Server 中的 Binder 实体对象;
  • 从 Client 进程的角度看,Binder 指的是对 Binder 代理对象,是 Binder 实体对象的一个远程代理
  • 从传输过程的角度看,Binder 是一个可以跨进程传输的对象;Binder 驱动会对这个跨越进程边界的对象对一点点特殊处理,自动完成代理对象和本地对象之间的转换。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容