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发表的报告中提到“面向客户…...
一篇带你MySQL运维
1. 日志 1.1 错误日志 错误日志是 MySQL 中 重要的日志之一,它记录了当 mysqld启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。 该日志是默认开启的&…...
《嵌入式 – GD32开发实战指南》第22章 SPI
开发环境: MDK:Keil 5.30 开发板:GD32F207I-EVAL MCU:GD32F207IK 22.1 SPI简介 SPI,是Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的…...
一个优质软件测试工程师的简历应该有的样子(答应我一定要收藏起来)
个人简历 基本信息 姓 名:xxx 性 别: 女 年 龄:24 现住 地址: 深圳 测试 经验:3年 学 历:本科 联系 电话:18xxxxxxxx 邮 箱:xxxxl163.com 求职意向 应聘岗位:软件…...
C++ 浅谈之 STL Deque
C 浅谈之 STL Deque HELLO,各位博友好,我是阿呆 🙈🙈🙈 这里是 C 浅谈系列,收录在专栏 C 语言中 😜😜😜 本系列阿呆将记录一些 C 语言重要的语法特性 🏃&a…...
Koa2-项目中的基本应用
文章目录安装配置koa2配置nodemon,热更新我们的项目中间件什么是中间件👻洋葱模型路由中间件连接数据库 - mysql后端允许跨域处理请求getpostputdelete后续会继续更新安装配置koa2 👻安装 koa2 npm i koa2 -s👻在package.json 配置,当然是在…...
Flask入门(2):配置
目录2.Flask配置2.1 直接写入主脚本2.2 系统环境变量2.3 单独的配置文件2.4 多个配置类2.5 Flask内置配置2.Flask配置 我们都知道,Flask应用程序肯定是需要各种各样的配置。来满足我们不同的需求的,这样可以使我们的应用程序更加灵活。比如可以根据需要…...
Linux--fork
一、fork入门知识 fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。可以简单地说fork()的作用就是创建一…...
计算机组成原理(一)
1.了解计算机硬件的发展和软件的发展历程; 硬件: 电子管时代(1946-1959):电子管、声汞延迟线、磁鼓 晶体管时代(1959-1964):晶体管、磁芯 中、小规模集成电路时代&#…...
【SpringBoot】实现Async异步任务
1. 环境准备 在 Spring Boot 入口类上配置 EnableAsync 注解开启异步处理。 创建任务抽象类 AbstractTask,并分别配置三个任务方法 doTaskOne(),doTaskTwo(),doTaskThree()。 public abstract class AbstractTask {private static Random r…...
Node =>Express学习
1.Express 能做什么 能快速构建web网站的服务器 或 Api接口的服务期 Web网站服务器,专门对外提供Web网页资源的服务器Api接口服务器:专门对外提供API接口的服务器 2.安装 在项目所处的目录中,运行以下命令,简装到项目中了 npm …...
深圳网站建设培训班/seo推广系统
论理靠约架,打架靠群殴,无论说得如何冠冕堂皇,如何煽情,说白了,都是没有开化的野蛮人! 这些人谈民主,是当下最大的冷笑话。 那一大块还是一大坨的东西,别以为黄色就能冒充金子&#…...
武汉网站制作迈佳/免费好用的crm软件
最近购物节一波接一波,往常家里的孩子总嚷嚷着要买玩具,但这段时间却吵着要买球?到底是咋了?原来,最近有一档节目风靡全网,尤其是孩子们都成了“忠实粉丝”,收视率期期第一,它就是金…...
ecshop做的小说网站/免费网络推广100种方法
2020 无疑是特殊的一年,而 AI 在开年的这场”战疫“中表现出了惊人的力量。站在“新十年”的起点上,CSDN【百万人学AI】评选活动正式启动。本届评选活动在前两届的基础上再度升级,设立了「AI优秀案例奖Top 30」、「AI新锐公司奖Top 10」、「A…...
什么网站做微信公众账号/网络营销课程个人总结3000字
原因:音频编码原来为AMR,ios那边貌似不支持这种音频编码 VideoAbsActivity.java 加了 mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 将音频录制格式从默认…...
蒙古网站群建设/百度邮箱注册入口
首先了解两个概念,胜者树和败者树: 胜者树和败者树都是二叉排序树,是树形选择排序的一种变形。每个叶子节点相当于一位选手,每个中间结点相当于一场比赛,每一层相当于一轮比赛。胜者树的中间结点记录的是胜者的标号&a…...
学校网站怎么建设/想学销售去哪培训
气候类 1、北京日均最低气温 var bj_temp_ low [-6,-4,3,10,16,21,24,23,17,9,1,-5]2、北京日均最高气温 var bj_temp_ hight [3,6,15,23,29,32,33,32,27,19,10,4]3、北京历史最高气温 var bj_temp_ max [24,19,29,34,38,38,39,36,32,28,24,28]4、北京历史最低气温 var …...