0%

Android系统Binder驱动分析(1)

提前掌握Binder的基础知识(预习)

Android系统架构的底层就是linux,本篇文章如有不懂的地方,建议参考原文文档,以便更好帮助自己学习。
希望能跟大家多多交流 !!!

Linux的基础知识

Binder究竟是什么
什么是linux的系统内存
内核空间是什么
进程隔离
用户空间是什么

Binder究竟是什么

Binder是Android系统中负责每个用户进程内核通信的机制(驱动)

内核空间是什么

内核空间

System memory in Linux can be divided into two distinct regions: kernel space and user space. Kernel space is where the kernel (i.e., the core of the operating system) executes (i.e., runs) and provides its services.
系统内存在的Linux可以分为两个不同的区域:内核空间用户空间。内核空间是内核(即操作系统的核心)执行(即运行)并提供其服务的地方。

内核的作用是什么:

One of the roles of the kernel is to manage individual user processes within this space and to prevent them from interfering with each other.
内核的作用之一是管理该空间内的各个用户进程并防止它们相互干扰。
这里涉及到一个概念 : 进程隔离

进程隔离

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

内核空间的误区

The kernel is a program that constitutes the central core of a computer operating system. It is not a process, but rather a controller of processes, and it has complete control over everything that occurs on the system. This includes managing individual user processes within user space and preventing them from interfering with each other.

内核是构成计算机操作系统中央核心的程序。它不是一个进程,而是一个进程的控制器,它可以完全控制系统上发生的一切。这包括管理用户空间内的单个用户进程并防止它们相互干扰。

用户空间

用户空间

User space is that portion of system memory in which user processes run
用户空间是用户进程在其中运行的系统内存部分

用户空间跟用户进程的区别

User space is that set of memory locations in which user processes (i.e., everything other than the kernel) run
用户空间是一组内存位置,用户进程(即内核以外的所有东西)在其中运行。
每个正在运行的App都是一个用户进程,再不干涉的情景下,互相独立互不影响,都有属于自己的进程的用户空间。

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

Kernel space can be accessed by user processes only through the use of system calls
用户空间访问内核空间的唯一方式就是系统调用

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

扩展概念

系统调用

系统调用是 类 Unix 操作系统中活动进程对内核执行的服务的请求,例如输入/输出(I/O) 或进程创建。活动进程是当前在 CPU 中进行的进程,与在 CPU 中等待其下一次运行的进程相反。I/O 是将数据传入或传出 CPU 以及传入或传出外围设备(如磁盘驱动器、键盘、鼠标和打印机)的任何程序、操作或设备。
系统调用主要通过如下两个函数来实现:

1
2
copy_from_user() // 将数据从用户空间拷贝到内核空间
copy_to_user() // 将数据从内核空间拷贝到用户空间

Linux 使用两级保护机制:

Linux 使用两级保护机制:0 级供系统内核使用,3 级供用户程序使用。

Linux 内存映射

Binder IPC 机制中涉及到的内存映射通过 mmap() 来实现,mmap() 是操作系统中一种内存映射的方法。内存映射简单的讲就是将用户空间的一块内存区域映射到内核空间。映射关系建立后,用户对这块内存区域的修改可以直接反应到内核空间;反之内核空间对这段区域的修改也能直接反应到用户空间。

内存映射能减少数据拷贝次数,实现用户空间和内核空间的高效互动。两个空间各自的修改能直接反映在映射的内存区域,从而被对方空间及时感知。也正因为如此,内存映射能够提供对进程间通信的支持。

动态内核可加载模块

正如前面所说,跨进程通信是需要内核空间做支持的。传统的 IPC 机制如管道、Socket 都是内核的一部分,因此通过内核支持来实现进程间通信自然是没问题的。但是 Binder 并不是 Linux 系统内核的一部分,那怎么办呢?这就得益于 Linux 的动态内核可加载模块(Loadable Kernel Module,LKM)的机制;模块是具有独立功能的程序,它可以被单独编译,但是不能独立运行。
它在运行时被链接到内核作为内核的一部分运行。这样,Android 系统就可以通过动态添加一个内核模块运行在内核空间,用户进程之间通过这个内核模块作为桥梁来实现通信。

在 Android 系统中,这个运行在内核空间,负责各个用户进程通过 Binder 实现通信的内核模块就叫 Binder 驱动(Binder Dirver)。