Binder 的学习需求了解以下三方面的基础内容:

出于篇幅考虑,本文先讲解虚拟内存与Linux 文件拜访体系接口

1.什么是虚拟内存

一些简略的计算机体系,比方简略的单片机,cpu 是直接拜访物理内存的,不存在虚拟内存,一起也不存在操作体系,咱们的程序直接跑在硬件之上。

学习 Binder 的预备知识1 —— 虚拟内存与 Linux 文件访问接口

读内存的进程如下:

  • cpu 经过控制总线向内存发送读指令
  • 随后将内存地址经过地址总线发送给内存
  • 内存读到数据后,经过数据总线将数据发送给 cpu

物理内存的地址从 0 开端,咱们编写的代码读写内存也是从 0 开端。

单片机上只跑一个程序的时分,全部安好。

假如咱们要再跑一个程序,咱们读写内存假如还是从 0 开端,就会和第一个程序“打架”,发生冲突。假如不从 0 开端,比方咱们规则第一个程序运用 0 到 4k的内存,第二个程序运用 4k 到 8k 的内存 ,这样能解决问题,但是,咱们的程序就只能在特定环境下运用。

那怎么办,加一层————虚拟内存。

咱们的每个进程拜访的是从 0 开端的虚拟内存,在经过 mmu (内存管理单元)映射到物理内存,mmu 能够了解为一张巨大的表格,里边记录着每个进程运用的虚拟内存地址与物理内存地址的映射关系:

学习 Binder 的预备知识1 —— 虚拟内存与 Linux 文件访问接口

  • 进程1 发出读内存信号
  • 进程1 向 MMU 发送一个虚拟地址
  • MMU 在自己的表格中找到对应的物理地址,并从物理内存上读出数据,将数据回来给进程 1

对于虚拟地址空间一般分为:

  • 内核地址空间
  • 用户地址空间

学习 Binder 的预备知识1 —— 虚拟内存与 Linux 文件访问接口

不同进程之间的内核地址空间映射到相同的物理地址,即不同的进程的内核地址空间是共享的。不同进程之间的用户地址空间映射到不同的物理地址,相互之间是阻隔的,无法拜访的。

以上是虚拟内存的一个形象了解,对于软件开发人员已经足够,实际情况要杂乱许多,涉及了分段分页,一二级页表,快表等内容,更为详细的内容能够参考计算机组成,操作体系相关的书籍

2.Linux 文件拜访体系接口

在 Linux 中全部皆文件,比方 Android 中的 binder 实际是一个字符驱动,其对应的文件是 /dev/binder。所以咱们需求熟悉 Linux 中文件拜访体系的接口。

拜访文件常用的函数有下面几个:

open
close
read
write
ioctl
mmap

这些函数都是体系调用接口,由内核中的 VFS( Virtual Filesystem)供给,VFS 对上(应用层)供给一致的文件拜访接口,对下(文件体系,设备文件)根据不同目标特色,完成详细的操作,比方打开,读写等:

学习 Binder 的预备知识1 —— 虚拟内存与 Linux 文件访问接口

实际上,咱们应用层调用的 open read 等体系调用,经过内核部分的处理终究都是调用到驱动中完成的 xxx_open xxx_read 等函数。

关于 Linux 驱动更详细的入门内容,能够参考以下内容:

  • Kernel 下载与编译
  • Linux 驱动开发入门

关于

我叫阿豪,2015 年结业于国防科技大学,结业后,在某单位从事信息化装备的研制工作。首要研讨方向为 Android Framework 与 Linux Kernel。现在已退伍定居成都,首要做工程机械相关的出资,一起也在做 Android Framework 相关的技能共享。

假如你对 Framework 感兴趣或者正在学习 Framework,能够参考我总结的Android Framework 学习道路攻略,也可重视我的微信大众号,我会在大众号上继续共享我的经验,帮助正在学习的你少走一些弯路。学习进程中假如你有疑问或者你的经验想要共享给我们能够添加我的微信,我拉你进技能交流群。

学习 Binder 的预备知识1 —— 虚拟内存与 Linux 文件访问接口