七、Binder 机制初探

Read The Fucking Source Code

0. 准备工作

首先问自己几个问题:

  • 为什么要跨进程通信(IPC)? (进程之间是不可以通信的吗)
  • 怎么做到跨进程通信? (怎样用常规的方式在两个进程之间进行通信呢)
  • 为什么是 Binder ? (为什么常规的跨进程方式不行,而要专门使用 Binder)

回答这几个问题,我们得先了解一下几个概念。为后面做铺垫。

Android 系统是基于 Linux 内核的,因此有必要了解一些相关知识。

0.1 进程隔离

进程隔离是为保护操作系统中进程互不干扰而设计的一组不同硬件和软件的技术。这个技术是为了避免 进程A 写入 进程B 的情况发生。 进程的隔离实现,使用了虚拟地址空间。进程A 的虚拟地址和 进程B 的虚拟地址不同,这样就防止 进程A 将数据信息写入 进程B。

以上来自维基百科:进程隔离的安全性通过禁止进程间内存的访问可以方便实现。相比之下,一些不安全的操作系统(例如DOS)能够允许任何进程对其他进程的内存进行写操作。

根据以上描述,我们可以知道 操作系统的不同进程之间,数据是不共享的,即禁止进程间内存的访问。因此我们可以回答第一个问题。
Q:为什么要跨进程通信
A:根据上述可以得知,进程之间是不可以进行通信的,所以我们需要有某种方式来完成 跨进程通信。

0.2 用户空间 / 内核空间

详细解释可参考 Kernel Space Definition

Linux 系统内存可以分为两个不同的区域:内核空间用户空间
内核空间是内核(即操作系统的核心)执行(即运行)并提供其服务的地方。
用户空间是指 用户进程(即内核以外的所有内容)运行的内存位置集。

Linux Kernel 是操作系统的核心,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。 内核的一个角色是管理这个空间中的各个用户进程,并防止它们相互干扰。
对于Kernel这么一个高安全级别的东西,显然是不容许其它的应用程序随便调用或访问的,所以需要对Kernel提供一定的保护机制,这个保护机制用来告诉那些应用程序,你只可以访问某些许可的资源,不许可的资源是拒绝被访问的,于是就把Kernel和上层的应用程序抽像的隔离开,分别称之为Kernel Space和User Space。

简单理解就是:
内核空间可以执行任意命令,调用系统的一切资源;
用户空间只能执行简单的运算,不能直接调用系统资源;
那么用户空间肯定会有想 调用系统资源 的需求,比如应用程序访问文件的等。

根据 Kernel Space Definition 这篇文字的详细说明,我们可以得知:

Kernel space can be accessed by user processes only through the use of system calls.
只有通过使用系统调用,用户进程才能访问内核空间。

0.3 系统调用 / 内核态 / 用户态

用户空间访问内核空间的唯一方式就是 系统调用;通过这个统一入口接口,所有的资源访问都是在内核的控制下执行,以免导致用户程序对系统资源的越权访问,从而保障了系统的安全和稳定。用户软件良莠不齐,要是它们乱搞把系统玩坏了怎么办?因此对于某些特权操作必须交给安全可靠的内核来执行。

当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)此时处理器处于特权级最高的(0级)内核代码中执行。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。处理器在特权等级高的时候才能执行那些特权CPU指令。

0.4 内存映射 之 mmap 方法

https://www.cnblogs.com/huxiao-tee/p/4660352.html#_label0
mmap 是 内存映射文件 的一种方法。即将一个文件或者其它对象映射到进程的地址空间。实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对应关系。

Linux 内核使用一个 vm_area_struct 结构体来表示一个独立的虚拟内存区域。
vm_area_struct 内包含一个 vm_ops 指针,其内部可引出所有针对这个区域可以使用的系统调用函数。
mmap 函数就是要创建一个新的 vm_area_struct 结构体,并将其与文件的物理磁盘地址相连。

总而言之,常规文件操作需要从磁盘到页缓存(处于内核空间)再到用户主存的两次数据拷贝。而mmap操控文件,只需要从磁盘到用户主存的一次数据拷贝过程。

具体的分析可查看如下文章

Gityuan Binder 系列
Binder 学习指南
Android 接口定义语言 (AIDL)
老罗的 Android 之旅
Android Bander设计与实现 - 设计篇
相见恨晚 Binder 机制

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

推荐阅读更多精彩内容