ARMv8-A 地址翻译技术之MMU的前世今生

2023-11-15

MMU的重要性不言而喻,支撑操作系统之上的各种复杂应用。但在正式讲MMU之前,我们先说说MMU的发展史,因为ARMv8-A的MMU相当复杂,直接切入正题,会显得比较枯燥。废话不多说,咱们马上开始:

一、前言:
关于虚拟内存系统的演变史,MMU在其中扮演了什么样的角色。
可以参考这一篇文章《操作系统的靠谱管家:虚拟内存》

早期计算机是没有MMU的概念的,也没有对存储器的抽象,直接将物理内存暴露给程序用。那个时候硬件资源有限,大家都勒紧裤腰带写程序,不敢多浪费一个字节。我曾经规划过一个游戏掌机的开源项目,将早期的街机游戏移植到现代硬件上。

在调研阶段我就发现,这些程序都很小,只有十几KB,但无一例外,都是对内存进行直接操作(有点类似单片机/微控制器编程)。


图 1.1 GAME BOY 掌机

但在那个年代,硬件的迭代速度不如软件快,而彼时的代码业务逻辑已经相当复杂,程序的体积呈指数级增长。

所以早期开发人员,为了使得越来越庞大的程序,能够在资源有限的硬件上运行,发明了ovelay-覆盖块技术,对程序进行分割、分段运行。

但这招治标不治本,并不能保证程序运行的足够顺畅,反而要为程序分段,增加的额外的工作量,这是一件相当痛苦的事情。所以开发人员把目光看向了硬件,决定从软硬两个方向下手。

说到这里,就不得不提一下早期的虚拟化技术。该技术的硬件虚拟化方向,为以后MMU的发展奠定了基础。

“硬件虚拟化”在狭义上是对内存、硬盘等硬件做虚拟化处理(软件为主),配合操作系统以达到分时复用的效果。1964 年,IBM 推出了大名鼎鼎的 System/360。它不仅提供了新型的操作系统,还实现了基于全硬件虚拟化(Full Hardware Virtualization)的虚拟机解决方案。

图 1.2 IBM 员工在调试机器

这其中就包括页式虚拟内存(4k 分页虚拟存储系统)、虚拟磁盘以及 TSS 分时系统。System/360 最多可提供14个虚拟机,每个虚拟机具有 256k 固定虚拟内存。有意思的是,System/360 的开发过程被视为了计算机发展史上最大的一次豪赌,为了研发 System/360,IBM 决定征召六万多名新员工,创建了五座新工厂。即便如此,当时的出货时间仍被不断顺延。

在后续的计算机发展中,内存被操作系统抽象出来,作为地址空间进行统一管理,按需分配给应用程序使用。这样作为内存的硬件细节(容量/类型/厂商/…)被操作系统隐藏了,程序只需要关心地址空间就可以。

同时操作系统引入了虚拟化技术,可以对内存进行"扩容",本质是对内存的分时复用,让每个程序认为自己独占了整个地址空间。但是这样做效率并不高,因为操作系统需要不断地做内存搬运。并且操作系统还要为内存的管理算法,付出许多额外的计算(比如地址翻译),非常浪费性能。

所以我们就需要设计硬件,来代替一些比较繁琐复杂的流程。最好能形成标准流程化操作,这样做成的硬件,可以持续优化(GPU也是这么出现的)。

因此,MMU诞生了,它接替了操作系统内存管理的比较复杂的部分,比如地址翻译;内存访问效率,则交给了 cache(高速缓存)去做,或者提高内存总线的带宽。

在现代操作系统中,衍生了一种更先进的内存管理技术,叫做虚拟内存系统,这是对主存的一种抽象概念。它由硬件异常、物理地址翻译、主存、磁盘文件和内核软件相互配合,共同组成。

虚拟内存系统主要提供了三种能力:一、提供主存的高速缓存,加快内存访问速度(高速缓存);二、为每个进程提供一致的地址空间,从而简化内存管理;三、防止每个进程的地址空间被其他进程所破坏(内存保护)。


图 1.3 虚拟内存系统简易图

MMU的作用,就是将虚拟地址翻译成物理地址。简单来说,CPU会生成一个虚拟地址(Virtual Address)来访问主存(这个地址实际上是操作系统来产生的,最后交给CPU执行)。访问之前,需要先将虚拟地址转换为物理地址,这个过程称作为地址转换(地址映射/地址翻译)。

为进行此操作,需要CPU硬件和操作系统合作,通过内存管理单元(Memory Management Unit)上的硬件翻译地址,来完成虚拟地址到物理地址的转换。MMU利用存储在主存上的查询表(translation table)来翻译虚拟地址,该表的内容由操作系统维护和管理。

图 1.4 MMU地址翻译/转换简化流程

说到这里,你可能对MMU的描述感到云里雾里,但不要紧,接下来我们会对它抽丝剥茧,一点点讲清楚。不过我们还需要对操作系统的虚拟内存系统,做一些更详细的讲解,这样再看MMU,就会非常轻松了。记住,这个先后顺序非常重要。

二、虚拟内存系统的原理:

这里我们只探讨虚拟内存系统如何管理虚拟内存的,关于cache部分,我们另说。

一般虚拟内存系统会将虚拟内存,划分为固定大小的块(又叫做最小粒度,一般有4KB、16KB、64KB等大小,其中4KB最流行),这个块我们称作为虚拟页(Virtual Page简称VP),同理将物理内存划分为物理页(Physical Page简称PP),也叫页帧(Page Frame)。

每个虚拟页的首地址,会被维护在一个表内,这个表叫做查询表或页表(Page Table,简称PT),页表内的每一个条目,被称为页表项(Page Table Entry,简称PTE)。

这个页表可能有多级,一般来说,级数越多,能覆盖的虚拟地址范围就越大。在多级页表当中,除最后一级页表之外的所有页表,它的页表项存放的不一定是物理页,也可能是下一级页表的地址。


图 2.1 虚拟内存系统的地址翻译/转换流程

在这个基础上,虚拟系统会产生一个虚拟地址,由虚页号+页偏移组成。 虚页号存放的一般是页表项的偏移地址(也可能是多级页表的组合),通过对页表的不断查询,最后找到对应的物理页(的首地址),然后加上虚拟地址的页偏移,就能顺利计算出真实的物理地址。如图2.2所示:


图 2.2 虚拟内存系统的地址翻译/转换详细流程

这个流程,可以用一个很恰当的例子去描述,就是在地图软件上找一个地方儿。

以我在地图上找酒店入住为例,目的地在“四川省-成都市-青羊工业区-成飞路-5号”。于是,我通过手机软件,找到一家到酒店,位置是“四川省-成都市-青羊工业区-成飞路10号”。

哎~,有意思的地方来了, 现在我们以虚拟内存系统的概念,去套这个地址。

首先说虚拟地址(映射为我们生活上划分的位置)。“四川省”是一级页表项的偏移地址,一级页表的范围最大,它有好多个城市(页表项);“成都市”是二级页表项的偏移地址,二级页表的范围次之,它有好多个区(页表项);“青羊工业区”是三级页表项的偏移地址,三级页表的范围已经很小了,但是它也有好多条路(页表项);成飞路就是四级页表项的偏移地址,通过访问成飞路这个页表项,就可以找到它代表的物理页,里面有很多地址(也就是门牌号),目的地在5号,我要住的酒店在10号。

再说对应物理地址。这里从地理角度讲,可以划分为不同的坐标,这里我们就把四川省划分为同等大小的区域,正好被虚拟地址规定的几级页表瓜分。这个区域(路)就是物理页,假设坐标的最小寻址单位,就是通过门牌号寻址。现在,我们再变化一下图2.2,那么你就可以清晰的认识这个过程了。如图2.3(一定要好好观察,并结合我上面的文字走一遍这个流程,图中的每一个箭头都有意义,应该好好研究):


图 2.3 类比地址转换

同样的道理和方法,就可以找到我酒店的位置,是不是没有想象中那么复杂?而MMU的工作,主要就是做地址的转换、翻译。在这里,虚拟内存系统主要扮演的角色,维护多级页表,控制虚拟地址的映射范围。虚拟系统一般是操作系统的组成部分,这部分工作,也可以说是操作系统帮我们做了。MMU只需要不停地从页表里逐级查找,得到最后的物理页,然后结合虚拟的地址后半部分的页偏移,计算真实的物理地址。

不知道大家有没有注意到,上面我说过,“最后一级页表前的所有页表,它的页表项存放的不一定是物理页,也可能是下一级页表的“页表项的偏移””,反过来讲,每一级页表项,都可以存放物理页和下一级页表的地址,这里我们给存放物理页的页表项叫做块(Block Entry,简称BE);给存放下一级页表地址的页表项叫做TE(Table Entry,简称TE,中文不知道叫啥)。不同的是,每一级页表项存放的块,它的大小是不同的。一般一级页表的块最大,之后逐级递减。

最后,大家可以思考一下,页表级数、块大小的不同,会对地址翻译产生什么样的影响?如果我的CPU只有32位,但是我想实现大于32位地址范围的虚拟地址访问,又该如何操作?

今天先讲到这个,以上全当一道开胃菜儿。关于MMU的故事,我们娓娓道来。关于我上面提出的问题,我们将在下一篇文章揭晓,并为大家介绍ARM的MMU是如何工作的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARMv8-A 地址翻译技术之MMU的前世今生 的相关文章

  • 聊聊最近几年的路径追踪技术的进展(一)

    路径追踪技术 Path tracing PT 已经是当下工业中离线渲染使用的主流技术 不管是商业渲染器如皮克斯的RenderMan Solid Angle的Arnold等 还是迪士尼的in house渲染器Hyperion以及Weta Di
  • 苏宁!你还挺得过去吗?(苏宁大幅裁员)

    前两天才写了一篇 作为一个江苏人 我眼中的苏宁 说实话 我内心是有点不太相信 偌大的苏宁会走到今天这步田地 可一件件传闻都慢慢变成了实锤 一 苏宁大裁员 一位多年老友刚跳槽去了苏宁 入职一个月 就面临整个部门裁员 据说要直接裁掉4成研发人员
  • 【信号采集】基于FPGA的高速信号采集系统

    1 高速采集系统实现的功能 FPGA内部功能模块组成 2 高速ADC接口的FPGA实现 3 数字下变频 DDC 的FPGA实现 4 三倍抽取功能的FPGA实现 5 Aurora接口的FPGA实现 高速采集系统的功能和组成 1 实现功能 对中
  • LC振荡器设计

    设计要求 设计出振荡频率为10GHZ的LC振荡器 如有侵权即删 一 设计步骤 1 选取LC振荡回路的值 f L 5 经验公式 可能会根据工艺的不同而变化 可以提前测试 f 10GHZ 得到选取的L值为0 5nH 寄生电阻设置为50m 注意
  • 什么是FPGA?为什么FPGA会如此重要?

    CPU GPU FPGA三者能力相加就是芯片的未来 很多粉丝问我 嵌入式方向中的FPGA怎么样 收入如何 前言 这个时候 一定会有抬杠青年说 我见过国内生产的FPGA芯片 还用过呢 通常遇到这一类质疑声 我一般都会说 你是对的 后来 要知道
  • 4. 从0开始学ARM-ARM指令,移位、数据处理、BL、机器码

    到底什么是Cortex ARMv8 arm架构 ARM指令集 soc 一文帮你梳理基础概念 科普 关于ARM指令用到的IDE开发环境可以参考下面这篇文章 1 从0开始学ARM 安装Keil MDK uVision集成开发环境 2 从0开始学
  • 【硬件架构的艺术】学习笔记(1)亚稳态的世界

    目录 1 亚稳态 1 1 什么是亚稳态 1 2 亚稳态窗口 1 3 避免亚稳态 1 3 1 使用多级同步器 1 3 2 使用时钟倍频电路的多级同步器 1 4 亚稳态测试电路 1 5 同步器的类型 1 6 亚稳态综合性建议 1 亚稳态 1 1
  • 如何使用JMeter进行压力测试

    一 前期准备 首先需要在官网下载jmeter 下载完之后打开bin目录下的jmeter bat 在jmeter bat中对所要压测的接口进行压力测试 二 具体步骤 1 创建线程组 在线程组中设置线程的个数 持续时间和循环次数 如下图所示 2
  • ARMv8-A 地址翻译技术之MMU的前世今生

    MMU的重要性不言而喻 支撑操作系统之上的各种复杂应用 但在正式讲MMU之前 我们先说说MMU的发展史 因为ARMv8 A的MMU相当复杂 直接切入正题 会显得比较枯燥 废话不多说 咱们马上开始 一 前言 关于虚拟内存系统的演变史 MMU在
  • 一文讲透CRC校验码-附赠C语言实例

    一口君最近工作用到CRC校验 顺便整理本篇文章和大家一起研究 一 CRC概念 1 什么是CRC CRC Cyclic Redundancy Checksum 是一种纠错技术 代表循环冗余校验和 数据通信领域中最常用的一种差错校验码 其信息字
  • 基于verilog设计一个硬件看门狗

    文章目录 一 看门狗简介 二 看门狗分类 三 看门狗模块设计 3 1 看门狗模块设计框图 3 2 顶层 3 3 计数器 3 4 边沿检测器 3 5 信号延迟模块 一 看门狗简介 看门狗 也称看门狗定时器 是常见于系统的一种外设 看门狗似乎就
  • Python - 使用多处理并行处理受 CPU 限制的任务

    多元处理 英语 Multiprocessing 也译为多进程 多处理器处理 多重处理 指在一个单一电脑系统中 使用二个或二个以上的中央处理器 以及能够将计算工作分配给这些处理器 拥有这个能力的电脑系统 也被称为是多元处理器系统 Multip
  • STM32示波器设计

    目录 前言 1 硬件模块 2 示波器基础知识 2 1 当头一棒就是 波形的概念 2 2 第二就是需要观察的波形参数 2 3 第三就是示波器参数 2 3 1 采样率 2 3 2 带宽 2 3 4 刷新率 3 ADC采集和DAC输出 3 1 A
  • 【数电】如何通俗地理解锁存器和触发器

    目录 一 相关知识 1 三极管和MOS管 2 TTL电路和CMOS电路 3 门电路 4 双稳态电路 二 锁存器 触发器 1 锁存器 2 触发器 1 电平触发的SR触发器 2 电平触发的D触发器 3 边沿触发的D触发器 4 脉冲触发的SR触发
  • VT Msr Hook Syscall

    VT Msr Hook Syscall 什么是系统调用 系统调用是内核提供给应用层的接口 比如在 win10x64 应用层打开一个应用 其实就是 explorer 调用了 CreateProcess 这个函数通过 NTDLL 调用表的 0x
  • RISCV架构单周期CPU设计

    指令选取 R类型指令 31 25 24 20 20 19 15 14 11 7 6 0 funct7 rs2 rs1 funct3 rd opcode 编号 指令 名称 1 add rd rs1 rs2 加 2 and rd rs1 rs2
  • 谷贱伤农,薪贱伤码农!

    最近被东方甄选刷屏了 截止6月21日 粉丝已经达到1749万 飞瓜数据显示 东方甄选已经是抖音带货第一名 东方甄选火起来也就是从上周那个双语带货视频在各个社群里到处转发 走到今天 也不过才一周多点的时间 从初火到大火 东方甄选 一周封神 一
  • 【数字IC】从零开始的Verilog SPI设计

    从零开始的Verilog SPI协议设计 一 写在前面 1 1 协议标准 1 2 数字IC组件代码 1 3 设计要求 1 4 其他协议解读 1 4 1 UART协议 1 4 2 SPI协议 1 4 3 I2C协议 1 4 4 AXI协议 二
  • 3. 从0开始学ARM-ARM模式、寄存器、流水线

    关于ARM的一些基本概念 大家可以参考我之前的文章 到底什么是Cortex ARMv8 arm架构 ARM指令集 soc 一文帮你梳理基础概念 科普 关于ARM指令用到的IDE开发环境可以参考下面这篇文章 1 从0开始学ARM 安装Keil
  • 第三章 时序逻辑设计基础

    第三章 时序逻辑设计基础 状态转移图 STG Mealy 状态机的顶点用状态进行标记 有向边用输入信号和输出信号来标记 Moore 状态机的顶点用状态和输出来标记 有向边用输入信号来标记 BCD 码到余3码的转换 如何画出状态图 1 状态就

随机推荐

  • 软件测试--------(人员管理web项目)

    软件测试计划书 1 引言部分 2 任务概述 3 测试项 4 需要测试的功能 5 方法与策略 6 不需测试的功能 7 测试项通过 失败的标准 8 测试中断和恢复的规定 9 测试完成所提交的材料 10 环境需求 11 测试人员的工作职责 12
  • uni-app实现点击按钮复制内容

    uni setClipboardData obj API方法
  • 手撸算法-两数之和-牛客

    描述 给出一个整数数组 请在数组中找出两个加起来等于目标值的数 你给出的函数twoSum 需要返回这两个数字的下标 index1 index2 需要满足 index1 小于index2 注意 下标是从1开始的 假设给出的数组中只存在唯一解
  • 记一次映射公网地址FTP服务问题的解决方法

    因为需要FTP公网进行访问 遂在公司搭建FTP服务使用软件 免费开源的Fillzilla Server版本 当然这不是主要的添加用户密码 用户访问目录 更改21端口为21212出现棘手问题 因为公司使用cisco路由器公网接入 默认所有公网
  • JavaWeb 文件上传和下载

    目录 一 文件上传 1 文件上传和下载的使用说明 2 文件上传基本原理 3 文件上传经典案例 3 1 页面实现 3 2 servlet实现 3 3 工具类实现 3 4 运行测试 3 5 注意事项 二 文件下载 1 文件下载基本原理 2 文件
  • 2023年自学网络安全学习路线,收藏这一篇就够了(超详细)

    00 网络安全为啥突然 火 了 随着网络空间成为第五空间 社会基础产业全面互联网化 网络安全 或称广义的信息安全 面临的威胁越来越大 对网络安全的人才需求也呈现出井喷趋势 即使目前很多人可以自学成才 网络空间安全 也成为一级学科 但根据 第
  • js动态加载js和css

    一 动态加载CSS动态创建css样式有两种方式 1 动态插入css外部文件的方法 function loadStyle url var link document createElement link link type text css
  • Android Instrumentation模拟鼠标点击事件

    看了几遍网上的博客一直没有 模拟出鼠标点击事件和按钮事件 后来抱着试试态度再重试的时候终于有所斩获 下面把具体的情况记录一下 首先我们必须了解类 Instrumentation Instrumentation发送键盘鼠标事件 Instrum
  • 什么是DNS服务器?有哪些作用?

    什么是DNS服务器 DNS服务器是 Domain Name System或者Domain Name Service 域名系统或者域名服务 域名系统为Internet上的主机分配域名地址和IP地址 用户使用域名地址 该系统就会自动把域名地址转
  • 智能一体化运维平台(一)java实现ssh连接

    一 思路 1 作为java的web后台应用 在做ssh连接的时候 比如导入所需要的协议jar包 如ssh jar 本次测试 本人使用的是 2 导入jar包后 开始进入代码编程 首先需要进行创建用户名 密码 端口 ip地址等变量 用来存储对应
  • 腾讯云技术分享:MySQL AHI 实现解析

    MySQL 定位用户记录的过程可以描述为 打开索引 gt 根据索引键值逐层查找 B 树 branch 结点 gt 定位到叶子结点 将 cursor 定位到满足条件的 rec 上 如果树高为 N 则需要读取索引树上的 N 个结点并进行比较 如
  • linux 线程和进程的区别与联系::

    进程 承担分配系统资源的基本实体 线程 调度的基本单位 线程是进程里面的执行流 线程在进程的地址空间内运行 linux中没有真正意义上的线程 线程是用进程模拟的 地址空间上 线程没有自己独立的地址空间 共享进程的空间 但是进程包含独立的地址
  • 微信小程序-“授权失败”场景的优雅处理

    微信小程序中提供了相关API 让开发者能获取到微信用户的相关信息 在首次去获取的时候会展示一个用户是否同意授权的对话框 发现有不少线上的小程序都没有处理好用户 拒绝授权 导致的 授权失败 场景 一个观点 私认为 开发微信小程序在用户授权上有
  • 蘑菇街前端面试

    vue与jquery的区别 为什么现在很多人使用vue vue怎样实现双向数据绑定 内部原理 1 jQuery首先要获取到dom对象 然后对dom对象进行进行值的修改等操作 2 Vue是首先把值和js对象进行绑定 然后修改js对象的值 Vu
  • iview Table中switch值无法刷新问题

    table里面的开关在修改状态以后 翻页后状态不在变化 render h params gt return h i switch props size large value params row filterContact on可以传入绑
  • Tkinter 组件详解(七):Entry

    Tkinter 组件详解之Entry Entry 输入框 组件通常用于获取用户的输入文本 何时使用 Entry 组件 Entry 组件仅允许用于输入一行文本 如果用于输入的字符串长度比该组件可显示空间更长 那内容将被滚动 这意味着该字符串将
  • leetcode刷题——多维枚举(一)

    题目一 思路 双指针 bool isSubsequence char s char t int fast 0 int slow 0 while slow
  • JavaWeb之Servlet详解

    文章目录 一 什么是Servlet 二 Servlet 1 Servlet是如何起作用的 2 Servlet接口中的方法 3 Servlet对象的生命周期 三 ServletConfig 1 什么是ServletConfig 2 Servl
  • MOS驱动自举电容和限流电阻的选取

    自举电容选取 最近做逆变时出现了异常 使用2104驱动MOS管 蓝色为滤波后双端带载时出现的波形 一端带载时没有问题 放大波形后发现输出波形在占空比满值时垮掉 产生严重的震荡 可以看到波形顶部斜向下 我们可以推断是驱动自举电容值偏小 当占空
  • ARMv8-A 地址翻译技术之MMU的前世今生

    MMU的重要性不言而喻 支撑操作系统之上的各种复杂应用 但在正式讲MMU之前 我们先说说MMU的发展史 因为ARMv8 A的MMU相当复杂 直接切入正题 会显得比较枯燥 废话不多说 咱们马上开始 一 前言 关于虚拟内存系统的演变史 MMU在