Binder机制详解(二)

Android Binder通信底层超详细讲解 前言 复习、复习、复习 你是否了解Binder机制? Binder这么好用,那为什么Zygote的IPC通信机制用Socket而不用Binder? 为什么说Binder是安全的? Intent跨进程传大图为什么会崩溃? AIDL的oneWay和非oneway有什么区别? 本文将针对以上问题进行原理分析 目录 一、IPC机制 Inter-Process Communication 简称 IPC ,即为进程间通信。Android与Liunx都有自己的IPC机制。虽然说Android是继承自Linux的,但是I 阅读详情

系列章节:

Binder机制详解(一)

Binder机制详解(三)


前言

上一章通过一个例子让我们认识了Binder通信机制不同于Linux的地方,还了解了用户空间和内核空间,这章我们主要来讲解MMU内存管理单元


一、什么是MMU

MMU(Memory Management Unit)主要用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权、多任务多进程操作系统。

二、发展历史

注意:学习一个知识点
很重要的一步是了解其为什么而存在?
它的存在是为了解决什么问题?
最后,在学习的过程中带着这些问题去理解、去思考

在许多年以前,还是使用DOS或一些古老的操作系统时,内存很小,同时,应用程序也很小,将程序存储在内存中基本能够满足需要。随着科技的发展,图形界面及一些其他更复杂的应用出现,内存已经无法存储这些应用程序了,通常的解决办法是将程序分割成很多个覆盖块,覆盖块0最先运行,运行结束之后,就调用另一个覆盖块,虽然这些操作由OS来完成,

​ 但是,需要程序员对程序进行分割,这非常不高效;因此,人们想出了一个**虚拟存储器(virtual memory)**的方法。

​ 虚拟存储器的基本思想是:程序、数据、堆栈的总大小可以超过内存空间的大小,

​ 操作系统将当前运行的部分保存在内存中,未使用的部分保存在磁盘中。

​ 比如一个16MB的程序和一个内存只有4MB的机器,操作系统通过选择可以决定哪部分4MB的程序内容保存在内存中,并在需要时,在内存与磁盘中交换程序代码,

这样16MB的代码就可以运行在4MB的机器中了

三、相关概念

地址范围、虚拟地址映射成物理地址以及分页机制**

  • 地址范围: 指处理器能够产生的地址集合,如一个32bit的处理器,其能产生的地址集合是0x0000 0000 ~ 0xffff ffff(4G),这个地址范围也称为虚拟地址空间,其中对应的地址为虚拟地址。

  • 虚拟地址与物理地址: 与虚拟地址空间和虚拟地址相对应的是物理地址空间和物理地址;物理地址空间只是虚拟地址空间的一个子集。如一台内存为256MB的32bit主机,其虚拟地址空间是0 ~ 0xffffffff(4GB),

  • 物理地址空间范围是0 ~ 0x0fff ffff(256M)

四、分页机制

如果处理器没有MMU,或者有MMU但没有启用,CPU执行单元发出的内存地址将直接传到芯片引脚上,被内存芯片(以下称为物理内存,以便与虚拟内存区分)接收,这称为物理地址(Physical Address,以下简称PA),如下图所示:
在这里插入图片描述
如果处理器启用了MMU,CPU执行单元发出的内存地址将被MMU截获,从CPU到MMU的地址称为虚拟,而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将VA映射成PA,,如下图:
在这里插入图片描述
linux使用MMU的机器都采用分页机制。虚拟地址空间以页为单位进行划分,而相应的物理地址空间也被划分,其使用的单位称为页帧,页帧和页必须保持相同,因为内存与外部存储器之间的传输是以页为单位进行传输的。

例如,MMU可以通过一个映射项将VA的一页0xb70010000xb7001fff映射到PA的一页0x20000x2fff,如果CPU执行单元要访问虚拟地址0xb7001008,则实际访问到的物理地址是0x2008。

​ 虚拟内存的哪个页面映射到物理内存的哪个页帧是通过页表(Page Table)来描述的,页表保存在物理内存中,MMU会查找页表来确定一个VA应该映射到什么PA。

1.页表的概念

  • CPU在执行指令与数据时,获得的是虚拟内存的地址

但是CPU只能去物理内存寻址。此时,MMU就派上用场了。MMU负责,将虚拟地址,翻译成,真正运行时的物理地址。
MMU是如何将虚拟地址翻译成物理地址的,这个后面讲。现在先要了解一下交换区的概念。

交换区: 实际上就是一块磁盘空间(硬盘空间)。虚拟内存与物理内存映射的时候,是将虚拟内存的代码放到交换区中,以后在CPU想要执行相关的指令或者数据时,如果内存中没有,先去交换区将需要的指令与数据映射到物理内存,然后CPU再执行

虚拟内存与交换取的这种概念,实现了大内存需求量的(多个)进程,能够(同时)运行在较小的物理内存中。

到这里,我们应该大致明白了虚拟内存的作用与简单机制。还剩下MMU如何翻译虚拟地址为物理地址的,这放到最后讲解。现在先总结一下虚拟内存机制:

虚拟内存需要重新映射到物理内存
虚拟地址映射到物理地址中的实际地址
每次只有进程的少部分代码会在物理内存中运行
大部分代码依然位于磁盘中(存储器硬盘)

2.页式内存管理

上面笼统的介绍了虚拟内存的概念。接下来学习内存管理中的一种方式:页式内存管理

页式内存管理中我们需要了解:

  • 页的概念
  • 页表的概念
  • 缺页的概念与页命中的概念
  • 分配页面
  • 程序的局部性原则

1、页的概念
我们知道了交换区。我们知道交换区里面存放的是大部分的可执行代码与数据。而物理内存中,执行的是少部分的可执行代码与数据。
那么此时就需要从交换区获取程序的代码,将它拿到物理内存执行。那么一次拿多少代码过来呢?这是一个问题!
为了CPU的高效执行以及方便的内存管理,每次需要拿一个页的代码。这个页,指的是一段连续的存储空间(常见的是4Kb),也叫作块。
假设页的大小为P。在虚拟内存中,叫做虚拟页(VP)。从虚拟内存拿了一个页的代码要放到物理内存,那么自然物理内存也得有一个刚好一般大小的页才能存放虚拟页的代码。物理内存中的页叫做物理页(PP)
在任何时刻,虚拟页都是以下三种状态中的一种:

  • 未分配的:VM系统还未分配的页(或者未创建),未分配的页还没有任何数据与代码与他们相关联,因此也就不占用任何磁盘。
  • 缓存的: 当前已缓存在物理内存中的已分配页
  • 未缓存的:未缓存在物理内存中的已分配页

2、页表的概念
虚拟内存中的一些虚拟页是缓存在物理内存中被执行的。理所应当,应该有一种机制,来判断虚拟页,是否被缓存在了物理内存中的某个物理页上。如果不命中(需要一个页的代码,但是这个页未缓存在物理内存中),系统还必须知道这个虚拟页存放在磁盘上的哪个位置,从而在物理内存中选择一个空闲页或者替换一个牺牲页,并将需要的虚拟页从磁盘复制到物理内存中。

​ 这些功能,是由软硬件结合完成的。 包括操作系统软件,MMU中的地址翻译硬件,和一个存放在物理内存中的页表的数据结构。

​ 上一节说将虚拟页映射到物理页,实际上就是MMU地址翻译硬件将一个虚拟地址翻译成物理地址时,都会去读取页表的内容。操作系统负责维护页表的内容,以及在磁盘与物理内存之间来回传送页。

页表实际上就是一个数组。这个数组存放的是一个称为页表条目(PTE)的结构。虚拟地址空间的每一个页在页表中,都有一个对应的页表条目(PTE)。虚拟页地址(首地址)翻译的时候就是查询的各个虚拟页在页表中的PTE,从而进行地址翻译的。


总结

这次讲解了内存管理单元,页和页表的概念,下次将从Binder的用法和四层结构来讲解

Android Binder原理(二)ServiceManager中的Binder机制 本文首发于微信公众号「后厂技术官」 前言 在上一篇文章中,我们了解了学习Binder前必须要了解的知识点,其中有一点就是Binder机制的三个部分:Java Binder、Native Binder、Kernel Binder,其中Java Binder和Native Binder都是应用开发需要掌握的。Java Binder是需要借助Native Binder来工作的,因此需要先了解Nat... 阅读详情

相关推荐

Binder (二) binder 机制的管理者的角色Service Manager

binder 机制的管理者的角色Service Manager Service Manager进程负责管理client server角色, 上下文管理者context_manager BINDER_SET_CONTEXT_MGR int binder_become_context_manager(struct binder_state *bs) { return ioctl(bs->...

gbmaotai的博客 473

IPC 之Binder基础

IPC 系列文章:建议按顺序阅读。在平时的开发中,大部分时候都在编写单个App,每个App就是个进程。App之间的通信即是进程间通信(IPC),Android采用Binder进行IPC。通过本篇文章,你将了解到:1、Linux IPC 基础2、Linux IPC 常用方式3、Android Binder 简单认识4、Android Binder 使用场合。

chuyouyinghe的专栏 280

Android Binder 机制初步学习 笔记(二)—— Binder 设备基本操作实现

Binder 设备基本操作实现:Binder 设备初始化、打开、内存映射与缓冲区管理。 binder_init() / binder_open() / binder_mmap()

小石不识月,呼作白玉盘。 1937

虚拟内存基本概念与原理

虚拟内存介绍,有了它物理地址、虚拟地址、MMU的地址翻译过程不再模糊。

qq_36215132的博客 3510

openclaw + ollama本地模型 + 飞书平台 windows平台部署教程

本教程将指导您在 Windows 10/11 环境下,通过 Ollama 运行本地模型,并结合 OpenClaw 接入飞书,搭建一个完全本地化的 AI 助手。

专注于技术研发行业技术主要有AI人工智能视觉识别、物联网技术、电商平台、app原生技术、微信小程序、鸿蒙语言开发、办公企业oa、ERP等,致力于做东半球最优秀的程序员 2173

嵌入式存储实战:FAL+SFUD+flashDB三件套在STM32上的完整移植指南(附避坑技巧)

本文提供了一套在STM32上完整移植FAL、SFUD与flashDB嵌入式存储框架的实战指南。详细解析了从SPI驱动配置、SFUD设备识别、FAL抽象层分区到flashDB键值数据库初始化的全流程,并分享了关键的避坑技巧与性能优化建议,帮助开发者构建稳定可靠的嵌入式存储系统。

rnn9storyteller的博客 1016

听宇哥讲Binder(Binder核心原理最全解析)

前面写了一篇关于AIDL的文章,那我们就从AIDL谈起吧。如果对AIDL有不理解的,可以先看看这一篇文章:再探AIDL_AD钙奶-lalala的博客-优快云博客我们还是延续前面一篇文章的例子来讲解,我们创建的AIDL文件如下: 然后Build->Make Project,会自动在build->generated->aidl_source_output_dir里面生成固定格式的文件。想了解Binder的原理,就先来了解一下AIDL吧。生成的文件如下: 这段生成的代码比较长,我们来拆解分析......

qq_36428821的博客 966

Docker容器n8n中 read/write files from disk 无法读取容器内文件解决方案

《n8n文件读写Docker部署常见问题解决方案》摘要:针对n8n 1.90.2版本在Docker环境下文件读写失败问题,本文分析常见错误包括路径错误(ENOENT)、权限不足(EACCES)及节点误用问题。核心解决方案为:1)通过-v参数挂载宿主机目录到容器(如/files);2)使用新版Read/WriteFilesfromDisk节点操作文件;3)确保权限设置正确。提供可直接导入的示例工作流JSON,演示从CSV读取到结构化数据处理的全流程。特别强调已部署用户需重新挂载卷的正确操作方式,并附解决方案对

m0_74822402的博客 2184

Android Binder 分析——匿名共享内存(Ashmem)

前面分析了 binder 中用来打包、传递数据的 Parcel,一般用来传递 IPC 中的小型参数和返回值。binder 目前每个进程 mmap 接收数据的内存是 1M,所以就算你不考虑效率问题用 Parcel 来传,也无法传过去。只要超过 1M 就会报错(binder 无法分配接收空间)。所以 android 里面有一个专门用来在 IPC 中传递大型数据的东西—— Ashmem(Anonymou

omnispace的博客 5358

Isaac Sim 使用经验(配置要求,云服务器)

Google Colab及AutoDL都是在docker内运行,其中google colab并不支持docker指令,而依照AutoDL的相关文档,AutoDL并不直接提供docker指令。2. Google Colab/AutoDL 不支持图形化界面,图形渲染等任务,所以没有办法使用Omniverse Streaming进行直播,从而更好的对结果进行展示。对于第一点,或许存在直接手动复现镜像的可能,但是考虑到Isaac Sim/Isaac Lab由于比较新,可能不够稳定,因此还是按照官方文档进行部署。

weixin_44211433的博客 4587

英飞凌TC3XX芯片---------CAN模块详解

CAN 总线是一种广泛应用于汽车、工业控制和其他领域的串行通信协议,CAN 英文名称:Controller Area Network。最初由德国的 Bosch 公司开发,用于汽车电子系统之间的通信。CAN 总线具有高可靠性、抗干扰能力强和实时性好等特点,因此被广泛应用于需要可靠数据传输的领域。CAN2.0B 协议中的 CAN 最多支持 29 位 ID,但是网络架构中使用的一般是 11 位的标准帧 ID。如下图是标准 CAN FD 帧数据结构:关于 CAN 协议相关内容,本文不作阐述。

sky的博客 3668

Android Binder机制(二) Binder中的数据结构

Android Binder机制(二) Binder中的数据结构 首页博客链接关于我留言板 在对Binder代码展开详细介绍之前,先列举出Binder机制中涉及到的数据结构。本文是一篇参考文章,读者在阅读代码的过程中遇到相关的数据结构,就可以查阅此文中的内容。本文列举的数据结构,涵盖了内核空间和用户空间两个部分。内核空间部分就是Binder驱动中涉及到的数据结构;而用户空间的部分,包括

CCJHDOPC的专栏: 882

自然语言处理:长文本场景下的关键词抽取实践

自然语言处理:长文本场景下的关键词抽取实践

丨汀、的博客 2076

Android中的Binder机制二(匿名Binder)

前言 上篇文章讲了AIDL的基本使用《AIDL的使用》,本文在上篇文章的基础上从应用层面的角度,分析一下Binder通信的一个大概过程,文章中分析所用到的代码,都是上篇文章中的代码,这里就不在重复粘贴之前的代码了。 基础概念 在Android中的Binder机制中,主要涉及四部分系统组件,分别是Client、Server、ServiceManager、Binder驱动,其中Client、Serve...

zhaonhui的博客 2605

03、AC分析

本节我们将对之前的BUCK电路进行AC分析! 首先,我们之前的BUCK电路是开环电路,现在我们把它设计成闭环电路!电路图如下: 我们对闭环BUCK电路先瞬态仿真一下,波形如下: 然后在电路中加入小信号和波特图进行AC仿真 原理图如下: 增益为0时所对应的相位裕度为56°,这个相位裕度一定要大于0°,大于45°则比较稳定! ...

soumns丶涛的博客 3517

2023年全国职业院校技能大赛 网络系统管理服务模块 Linux部分讲解

网络系统管理,Linux,服务部署,Chinaskills,2023国赛

weixin_62926639的博客 1547

Android中的binder机制分析二:以精简的语句来提炼binder

一、 个人心得: 网上很多讲binder的书籍和博客,喜欢一上来就从智能指针开始,我个人觉得,对于binder机制的研究,没有必要去深入钻研智能指针,把binder中所有的sp和wp都当成普通的指针就行了,其次,另一个就是一上来开始分析源码, 然后大家就会被各种名词给混淆: BnService, BpService, BBinder, Service Manager, binder driver,...

achina2011jy的博客 363

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Android IPC机制(二)Binder

在Android开发中,进程间通信(IPC)是一个重要的概念,而Binder则是Android系统中实现IPC的核心机制。本文将详细介绍Binder的工作原理、其在Android中的重要性以及与其他IPC机制的对比。

weixin_63357306的博客 1302

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android IPC机制(二)Binder的工作机制

Binder的理解 Binder是Android中的一个类,它实现了IBinder接口。 从各个角度来说明Binder: IPC Android Framework Android应用层 是Android中的一种跨进程通信方式;还可以理解为一种虚拟的物理设备,该方式在Linux中没有 是ServiceManager连接各种Manager和相应ManagerService的桥梁 是客...

Egypt_nova 604

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android Binder机制彻底梳理二

根据AIDL了解整体调用流程【重点分析AIDL流程】: 在上一次https://www.cnblogs.com/webor2006/p/11741743.html中我们已经对Android Binder机制有了一个比较深刻的认识了,最后也手动通过写了一个AIDL来实现两进程的通讯例子,这次则会更加进一步来以这个实际例子为角度进行流程分析,争取彻底将Android的Binder机制给梳理清。 对于...

webor2006的博客 143

Binder传输机制原理(二)

1 事务的传递和处理 从IPCThreadState的角度看,它的transact()函数是通过向binder驱动发出BC_TRANSACTION语义,来表达其传输意图的,而后如有必要,它会等待从binder发回的回馈,这些回馈语义常常以“BR_”开头。另一方面,当IPCThreadState作为处理命令的一方需要向发起方反馈信息的话,它会调用sendReply()函数,向binder驱动发出BC_REPLY语义。当BC_语义经由binder驱动递送到目标端时,会被binder驱动自...

heng615975867的专栏 1189

Android Binder机制学习总结(二)-Driver部分

本文主要分析Binder Driver的实现。Binder Driver 的实现代码位于 android kernel中:\drivers\staging\android\binder.c & \drivers\staging\android\binder.h.代码量不大,总计4000行左右。关于Kernal代码的下载,可以使用指令(如果https不行,就用http试试): git clon

a220315410的专栏 9533

android的binder机制研究二

转载:android的binder机制研究(C++部分)2010年10月16日 星期六 14:31http://kahweh.blog.sohu.com/160696746.html(一) 概述       android的binder机制提供一种进程间通信的方法,使一个进程可以以类似远程过程调用的形式调用另一个进程所提供的功能。binder机制在 Java环境和C/C++环境都有提供。    android的代码中,与C/C++的binder包括一些类型和接口的定义和实现,相关的代码在下面这几个文

Hello for world 1079

Binder通信机制(二)

AIDL生成Java类的细节: 流程图: 有一点要注意的是,IBinder的transact()方法中有个flag参数,0表示同步处理,IBinder.FLAG_ONEWAY表示异步处理。 Java层和native层的流程表现: 为什么Intent不能传递大数据? Activity的底层通讯是通过Binder,kernel分配给Binder的大小就是size=1M-8K(同步的情况),但是我们直接传1M-8K报错,因为在使用Binder通讯的时候,我们传递、获取数据都会放在一个包内:P

l18320786461的博客 3238
上一篇: Binder机制详解(一)
下一篇: Binder机制详解(三)
浮空over
博客等级 码龄7年 6粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值