Android 进阶——Framework 核心之Binder 相关预备理论(一)
文章大纲
- 引言
- 一、进程的内存空间和进程隔离
- 二、Linux 系统内存的用户空间和内核空间
- 1、用户空间(User Space)
- 2、内核空间(Kernel Space)
- 三、Linux IPC 原理
- 1、内核态和用户态
- 2、IPC 步骤
- 四、内核模块和驱动
- 五、Binder
- 1、Binder IPC概述
- 2、Binder的优势
- 2.1、Binder 传输性能高
- 2.2、Binder 安全性好
- 3、Binder 使用简单
引言
Android OS=Android Runtime+Linux 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号环,用户进程运行在3号环,如果一个用户进程需要其他高级权限,其必须从3号环过渡成0号环,过渡需要通过一个安全参数检查的网关,这种过渡被称为系统调用,在执行过程中会产生一定数量的计算开销。所以,用户空间要访问内核空间的唯一方式就是系统调用(System Call)
四、内核模块和驱动
在Linux中通过系统调用,用户空间程序就可以访问内核空间,本质上就是借助内核模块去完成的(因为内核空间是共享的)。Linux提供动态可加载内核模块机制(模块是具有独立功能的程序,它可以被单独编译,但不能独立运行)。即通过添加一个内核模块运行在内核空间,用户进程的以该模块作为桥梁完成互相通信了。而在Android系统中这个运行在内核空间的负责各用户进程Binder通信的内核模块叫做Binder驱动。
五、Binder
1、Binder IPC概述
从模型上来说Binder IPC基于C/S架构,提供服务的进程作为Server端,而请求服务的作为Client端,两者都运行在各自的用户空间上,只能通过运行于内核空间的Binder 驱动进行通信,而为了便于管理和使用服务Android采用了Service Manager进程统一管理所有的Binder服务。所谓通信本质上就是I/O,Linux 一切皆文件,于是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 优秀的架构设计可以像使用普通对象一样以面向对象的方式调用远程服务对象。
未完待续…
相关文章:

Android 进阶——Framework 核心之Binder 相关预备理论(一)
文章大纲引言一、进程的内存空间和进程隔离二、Linux 系统内存的用户空间和内核空间1、用户空间(User Space)2、内核空间(Kernel Space)三、Linux IPC 原理1、内核态和用户态2、IPC 步骤四、内核模块和驱动五、Binder1、Binder IP…...

【23种设计模式】结构型模式详细介绍
前言 本文为 【23种设计模式】结构型模式 相关内容介绍,下边将对适配器模式,桥接模式,组合模式,装饰模式,外观模式,亨元模式,代理模式,具体包括它们的特点与实现等进行详尽介绍~ &a…...

接口自动化实战-postman
1.测试模型 单元测试并非测试工程师的本职工作,它属于开发工程师的工作,开发进行单元测试的情况我们不知道,为了确保系统尽可能没有Bug,于是接口测试在测试工程师这里就变得由为重要了。实际工作中为菱形模型。 接口测试能更早的…...
前端跨域方案简单总结
1、什么是跨域 【】跨域是一种浏览器同源安全策略,也即浏览器单方面限制脚本的跨域访问。很多人可能误认为资源跨域时无法请求,实质上请求是可以正常发起的(指通常情况下,部分浏览器存在部分特例),后端也可…...

【HTML】HTML 表格 ② ( 表头单元格标签 | 表格标题标签 )
文章目录一、表头单元格标签二、表格标题标签一、表头单元格标签 表头单元格 可以在表格中 用作第一排 作为表格 的 表头 使用 , 表头单元格 中的 文本设置 可以与 普通单元格 中的文本设置 不同 ; 表头单元格 中的 文本 会 居中 , 并且 加粗 显示 ; 表头单元格 标签 如下 : &…...

常用的辅助类2(StringBuilder、StringBuffer、处理时间相关的类、对象比较器)
Java知识点总结:想看的可以从这里进入 目录7.7、字符串相关类7.8、时间处理7.8.1、JDK8前7.8.2、JDK8后1、时间日期类2、格式化日期3、其他7.9、对象比较器7.7、字符串相关类 String:JDK1.0出现,字符串类,被final修饰其值不可改。…...

anaconda下pytorchCPU GUP安装及问题记录
1 pytorch安装(CPU版本) pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple2 torchvision、torchaudio、torchtext安装:解决ModuleNotFoundError: No module named ‘torchvision‘问题 (…...
香港中文大学MISC Lab GNN团队: 异质图神经网络研究进展从谱的角度看待(图)对比学习(图自监督学习)
简介 实验室简介 香港中文大学机器智能与社会计算实验室(MISC Lab, Machine Intelligence and Social Computing Lab) 由Prof. Irwin King 创建并不断发展, 在图学习,推荐系统,自然语言处理,机器学习等领域取得了卓越的研究成果。在图学习方面, MISC Lab关注异质图学习(Het…...
C#开发的OpenRA的Enumerable.Concat方法应用
C#开发的OpenRA的Enumerable.Concat方法应用 在OpenRA游戏里,可以让用户指定搜索目录,也可以搜索应用程序所在的目录。 还需要把这两个结果集连接到一起,那么它是怎么实现的呢? 它是采用了Enumerable.Concat方法,实现两个列表的结果集进行合并。 可以看一下这个函数的代码…...
前端知识点总结(自参)
BFC 块级格式化上下文。BFC元素不会影响到其它环境中的布局。 触发BFC的条件 根元素或其它包含它的元素浮动元素 (元素的 float 不是 none)绝对定位元素 (元素具有 position 为 absolute 或 fixed)内联块 (元素具有 display: inline-block)表格单元格 (元素具有 display: tabl…...
[ 靶场环境片 ] kali-linux采用Docker 搭建 pikachu(特别详细)
🍬 博主介绍 👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋 🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝文末…...

阿里6面,成功唬住面试官拿了27K,软件测试面试也没有传说中那么难吧....
阿里的面试挺独特,每轮面试都没有 HR 约时间,一般是晚上 8 点左右面试官来一个电话,问是否能面试,能的话开始面,不能就约一个其它时间。 全程 6 面,前五面技术面,电话面试,最后一面…...

为什么静默安装未经过数字签名的驱动是不可行的?
我想,在 Windows XP 系统上,造成蓝屏的最主要原因是带有 Bug 的设备驱动程序。 请问在座的,谁赞成,谁反对。 因为驱动运行在内核模式,再也没有更高级别的组件对其进行行为监管,它可以做它想做的任何事情。…...

Caused by: java.sql.SQLException: ORA-28040: 没有匹配的验证协议
更改Oracle的配置文件:Oracle -> app -> ... ->...dbhome... -> admin重启Oracle:重启Oracle数据库的操作步骤1.查看监听器状态:lsnrctl status2.停止监听器:lsnrctl stop3.连接数据库:sqlplus / as sysdba4.停止数据…...

Dubbo3简单使用
Dubbo3简单使用 👉 使用Spring Boot实现Dubbo3,请参见以下地址。 # Dubbo3官网地址 https://cn.dubbo.apache.org/zh/# 使用SpringBoot实现Dubbo3的地址 https://cn.dubbo.apache.org/zh/docs3-v2/java-sdk/quick-start/spring-boot/# 该项目的git地址…...

Redis未授权漏洞蜜罐模拟与捕获分析
1.概述 文章主要分析Redis未授权漏洞的原理及形成原因,使用vulhub靶场进行漏洞复现,在了解漏洞原理并复现的基础上使用golang编写蜜罐代码进行模拟,开放端口在网上捕获真实存在的恶意攻击行为,对恶意样本进行分析,总结…...

Spring Security Oauth2.0认证授权
基本概念认证: 用户认证就是判断一个用户的身份是否合法的过程 ,用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问,不合法则拒绝访问。常见的用户身份认证方式有:用户名密码登录,二维码登录,手机…...

安卓小游戏:贪吃蛇
安卓小游戏:贪吃蛇 前言 这个是通过自定义View实现小游戏的第二篇,实际上第一篇做起来麻烦点,后面的基本就是照葫芦画瓢了,只要设计下游戏逻辑就行了,技术上不难,想法比较重要。 需求 贪吃蛇࿰…...

CUDA中的图内存节点
CUDA中的图内存节点 文章目录CUDA中的图内存节点1. 简介2. 支持的架构和版本3. API基础知识3.1. 图节点 APIs3.2. 流捕获3.3. 在分配图之外访问和释放图内存3.4. cudaGraphInstantiateFlagAutoFreeOnLaunch4. 优化内存复用4.1. 解决图中的重用问题4.2. 物理内存管理和共享5. 性…...

你真的看好低代码开发吗?
低代码开发前景如何,大家真的看好低代码开发吗?之前有过很多关于低代码的内容,这篇就来梳理下国内外低代码开发平台发展现状及前景。 01、国外低代码开发平台现状 2014年,研究机构Forrester Research发表的报告中提到“面向客户…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...