学校网站建设的重要性,电商网,dw做的网站如何发布,计算机就业方向与就业前景文章大纲引言一、进程的内存空间和进程隔离二、Linux 系统内存的用户空间和内核空间1、用户空间#xff08;User Space#xff09;2、内核空间#xff08;Kernel Space#xff09;三、Linux IPC 原理1、内核态和用户态2、IPC 步骤四、内核模块和驱动五、Binder1、Binder IP…
文章大纲引言一、进程的内存空间和进程隔离二、Linux 系统内存的用户空间和内核空间1、用户空间User Space2、内核空间Kernel Space三、Linux IPC 原理1、内核态和用户态2、IPC 步骤四、内核模块和驱动五、Binder1、Binder IPC概述2、Binder的优势2.1、Binder 传输性能高2.2、Binder 安全性好3、Binder 使用简单引言
Android OSAndroid RuntimeLinux Kernel。在Android系统中每一个应用程序都运行在独立的进程中确保了某个进程异常而不会影响另一个进程的运行自然就少不了进程间通信IPC(Internet Process Connection)。那么Android为啥没有采用Linux那么多的像管道Pipe、信号Signal和跟踪Trace、插口Socket、报文队列Message、共享内存Share Memory和信号量Semaphore等传统IPC手段而是自己设计开发一套独特的IPC 手段——Binder IPC呢接下来系列文章我们将全面揭开其神秘面纱第一篇先对Binder 有关的Linux常识进行小结学习完之后你会知道为什么要Binder 本系列文章中Service指的是提供服务的代码这些代码最终体现为一个个的接口方法换言之Service就是实现一组方法的对象通常也称为Service组件为了防止混淆我用了不严谨的Server组件替代并非Android 中的四大组件的概念另外UML类图可能不太严谨针对源码部分更多的是解读其功能而所有具体的实现代码仅供参考。 一、进程的内存空间和进程隔离
进程是一个可执行文件的执行体除了包含指令之外还有包含了大量的资源各自拥有独立的虚拟地址空间即进程空间。在Linux中通过虚拟内存机制为每个进程分配了线性连续的内存空间再将这虚拟内存空间映射到物理内存空间。这是出于安全的考虑每个进程的虚拟内存空间都是相对独立的每个进程只能操作自己的虚拟内存空间只有操作系统才有权限操作物理内存空间即所谓的进程隔离进程隔离保证了每个进程的内存安全。简而言之为了确保进程安全Linux通过虚拟内存机制实现了进程隔离。
二、Linux 系统内存的用户空间和内核空间
但是进程之间不可能是一个与世隔离的桃花源也需要互相通信于是对内存的操作既要确保安全又要互相通信 于是如上图所示 Linux操作系统在逻辑上将虚拟内存分为用户空间User Space和内核空间Kernel Space 以32位操作系统为例内核空间大小为3GB是一整块的用户空间大小为1GB 许多独立的小块。
1、用户空间User Space
可以理解为有很多小块用户空间通常每一个进程一个独立的用户空间所有的进程都是存储在用户空间上的只有同一个进程的用户空间才可以互相访问且用户空间是不能反射到内核空间 其中不同进程之间的用户空间互相独立用户空间和内核空间通过系统调用即内核提供的api 进行通信但共享内核空间而我们的应用程序是存储在一个独立的用户空间部分的内存中的表示进程运行在一个特定的操作模式中没有接触物理内存或设备的权限。
2、内核空间Kernel Space
Linux 系统中内核空间占绝大部分而是可以理解为是一整块且不同进程之间共享内核空间表示独立于普通的应用程序可以访问受保护的内存空间也有访问底层硬件设备的所有权限。
三、Linux IPC 原理
Linux已经拥有的进程间通信IPC手段包括(Internet Process Connection) 管道Pipe、信号Signal和跟踪Trace、插口Socket、报文队列Message、共享内存Share Memory和信号量Semaphore。 只有允许不同应用的客户端用 IPC 方式调用远程方法并且想要在服务中处理多线程时才有必要使用 AIDL如果需要调用远程方法但不需要处理并发 IPC就应该通过实现一个 Binder 创建接口如果您想执行 IPC但只是传递数据不涉及方法调用也不需要高并发就使用 Messenger 来实现接口如果需要处理一对多的进程间数据共享主要是数据的 CRUD就使用 ContentProvider如果要实现一对多的并发实时通信就使用 Socket
1、内核态和用户态
普通应用程序运行在用户空间系统内核运行在内核空间为了控制应用程序的访问范围、保证系统安全用户空间只能通过系统调用的方式去访问内核空间。当进程执行系统调用而陷入内核代码的时候即该进程陷入了内核态而进程在用户空间执行自己的代码的时候则是处于用户态。 Linux提供了系统调用作为切换用户态与内核态的机制。其底层是通过中断机制来实现的。简单的说当用户态执行到需要内核态执行的代码时会产生一个中断信号cpu收到信号后会根据中断信号传递的信息进入不同的中断函数当中断函数执行完毕后就会回到用户态。
2、IPC 步骤
由于进程 A 和进程 B 的虚拟地址不同因此它们之间是相互透明的都以为自己独享了系统的资源当然也不能直接跟对方交互。但是有些情况下有些进程难免会需要跟其他进程进行交互这个交互过程就叫 IPC(Inter-Process Communication进程间通信)。IPC 的实质就是数据的交互因此我们这里将进行 IPC 过程中的通信调用方和被调用方分别称为数据发送方和数据接收方则IPC 通信的过程如下
IPC 通信步骤1、数据发送方将数据放在内存缓存区通过系统调用陷入内核态2、内核程序在内核空间开辟一块内核缓存区通过 copy_from_user 函数将数据从数据发送方用户空间的内存缓存区拷贝到内核空间的内核缓存区中3、数据接收方进程在自己的用户空间开辟一块内存缓存区4、内核程序将内核缓存区中通过 copy_to_user 函数将数据拷贝到数据接收方进程的内存缓存区
因此进程通信的原理就是通过内核空间进行间接通信简单来说就是进程A通过系统调用访问内核空间并在内核空间操作一些数据再由内核空间告知给进程B要操作的数据。 操作系统中安全边界的概念就像环路的概念一样(前提是系统支持这种特性)一个环上持有一个特定的权限组Intel 支持四层环但是 Linux 只使用了其中的两环(0号环持有全部权限3号环持有最少权限1号和2号环未使用)系统进程运行在1号环用户进程运行在号环如果一个用户进程需要其他高级权限其必须从号环过渡成号环过渡需要通过一个安全参数检查的网关这种过渡被称为系统调用在执行过程中会产生一定数量的计算开销。所以用户空间要访问内核空间的唯一方式就是系统调用(System Call)
四、内核模块和驱动
在Linux中通过系统调用用户空间程序就可以访问内核空间本质上就是借助内核模块去完成的因为内核空间是共享的。Linux提供动态可加载内核模块机制模块是具有独立功能的程序它可以被单独编译但不能独立运行。即通过添加一个内核模块运行在内核空间用户进程的以该模块作为桥梁完成互相通信了。而在Android系统中这个运行在内核空间的负责各用户进程Binder通信的内核模块叫做Binder驱动。
五、Binder
1、Binder IPC概述
从模型上来说Binder IPC基于C/S架构提供服务的进程作为Server端而请求服务的作为Client端两者都运行在各自的用户空间上只能通过运行于内核空间的Binder 驱动进行通信而为了便于管理和使用服务Android采用了Service Manager进程统一管理所有的Binder服务。所谓通信本质上就是I/OLinux 一切皆文件于是Binder驱动通过虚拟出的设备文件/dev/binder连接Server进程、Client进程和Service Manager进程通过/dev/binder的句柄即可以进行I/O每一个句柄最大支持16个线程又由于Binder 需要一条管理自身的进程因此最多支持15条工作线程并发。
2、Binder的优势
2.1、Binder 传输性能高
得益于内存映射技术在初始化Binder设备时即把自己的内存映射到Binder驱动层内核空间只需要复制一次即可完成数据传输通过驱动在内核空间拷贝数据不需要额外的同步处理而Binder数据拷贝只需要一次而管道、消息队列、Socket都需要2次。当用户进程打开Binder设备后会调用mmap函数在驱动中创建一块内存空间用于接收传给本进程的Binder数据。当发生Binder调用时数据会从数据发送方复制到内核空间中驱动会在接收进程的缓冲区中寻找一块合适大小的空间来存放数据因为mmap使得接收进程的用户空间的缓冲区和内核空间的缓冲区是共享的这样接收进程就不需要将数据从内核复制到自己的用户空间了。
2.2、Binder 安全性好
在 Binder 通信时会根据 UID/PID 进行有效性检测支持实名binder和匿名binder(匿名Service存储的地方根据具体实现而定如果服务端不向外告知外部是不知道对象存在的当服务绑定客户端成功后才可以通过对象把服务传给远程的客户端)。
3、Binder 使用简单
得益于Binder 优秀的架构设计可以像使用普通对象一样以面向对象的方式调用远程服务对象。 未完待续…