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 hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...