操作系统的灵魂--MMU详解

news2024/10/5 18:29:13

虚拟内存是现代操作系统中最伟大的发明之一。它为每个进程提供了一个一致的、私有的地址空间,让每个进程产生了一种自己在独享主存的错觉。

为了讲清楚MMU是如何一步一步完成地址翻译,取出数据的,本篇文章在前4节中讲解了虚拟内存中一些重要的概念,比如,虚拟内存的作用,页命中,缺页异常处理,为什么需要TLB等等。最后,通过两个地址翻译的例子,详细解释了MMU地址翻译的过程。

1. 什么是虚拟内存?

  • 虚拟内存能够创建一个连续的更大的空间给进程使用,出现的原因是由于主存的空间是有限。

  • 当运行多个进程或者一个进程需要更大的空间进行存储运行,主存显然是不够的,这个时候就需要更大更便宜的磁盘进行保存一部分数据。

  • 对于进程来说,虚拟内存就是一张连续的内存空间,这个空间有些在主存中,有些在磁盘中。

2. 虚拟内存的作用

  • 虚拟内存将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,可以高效地使用主存。

  • 虚拟内存为每个进程提供了一致的地址空间,简化了内存管理。

  • 虚拟内存保护了每个进程的地址空间不被其他进程破坏。

3. 虚拟内存与物理内存

3.1 CPU存取数据

CPU通过MMU找到虚拟地址对应的物理地址

我们先来看下,CPU是如何根据地址取得数据的。

CPU 在这里生成的物理地址为 4,把地址发送给内存,然后内存从该地址获取其中保存的字,最后将其发送回 CPU。

MMU(Memory Management Unit)叫做内存管理单元,主要用来管理虚拟内存与物理内存的映射,由硬件自动完成。

3.2 物理地址常用术语

物理地址

这里需要比较烧脑地介绍几个名词,后面理解MMU地址翻译的时候会用到。

  • 物理内存(physical memory),主存RAM,实际能使用的物理空间。

  • 物理页(physical page),把物理内存按照页表的大小进行划分。

  • 物理地址(physical address,PA), 物理内存划分了根据物理页划分为很多块,通过物理地址进行定位。

  • 物理页号(physical page number,PPN) ,定位缓存中的数据字。

  • 物理页号偏移 (physical page offset, PPO),定位缓存中的数据块。

  • 缓存标记(cache tag,CT),在高速缓存中作为行匹配。

  • 缓存索引(cache index,CI),在高速缓存中作为组索引。

  • 缓存偏移(cache offset,CO),在高速缓存中用作行内偏移来选择目的数据块。

  • 物理页号偏移PPO = 组索引CI + 行内偏移CO。

  • 物理页号PPN = 行匹配CT。

  • 物理地址 PA = 物理页号 + 物理页号偏移 = PPN * page size + ppo。

3.3 虚拟地址常用术语

虚拟地址

  • 虚拟内存(virtual memory),每个程序独有,存放在磁盘上,由多个虚拟页(VP, virtual page)组成。

  • 虚拟内存的地址编码称虚拟地址空间(virtual address space VAS),跟物理内存一样,但虚拟内存是每个进程独有的,其大小是根据操作系统的指令集位有关,如32位,64位,32位,每个进程就有4G,64位有个百亿的GB。

  • 虚拟页(virtual page,VP ),把虚拟内存按照页表的大小进行划分。

  • 虚拟地址(virtual address),通俗说是计算机进程加载地址的指令,进程给的虚拟地址通过MMU进行获取地址计算物理地址空间,然后获取物理地址对应的数据传送到CPU上。

  • 虚拟页号(virtual page number ,VPN) ,用于定位页表的PTE。

  • 虚拟页号偏移(virtual page offset VPO) ,跟PPO值一样,定位物理内存的地址。

  • TLB索引(TLB index,TLBI),在页表中作为组索引。

  • TLBT标记(TLB tag,TLBT),在页表中作为行匹配。

  • 虚拟页号VPN = TLBT + TLBI。

  • 虚拟地址 VA = 虚拟页号 + 虚拟页号偏移 。

3.4 页表常用术语

页表

  • 页表(page tables),虚拟地址与物理地址的对应表集合。进程虚拟地址转换成物理地址,程序需要用到数据放在物理主存或磁盘某个位置,页表是存储在主存中。

  • 页表条目(page table entry PTE),虚拟地址与物理地址具体对应记录。页表是由多个页表条目PTE组成的数组,PTE 由一个有效位 和 n位地址字段组成,如果设置了有效位,那么地址字段就标识DRAM中相应的物理页的起始位置。

3.5 页命中/缺页

页命中

  1. 处理器产生一个虚拟地址。

  2. MMU生成PTE地址,并从高速缓存/主存请求得到它。

  3. 高速缓存/主存向MMU返回PTE。

  4. MMU构造物理地址,并把它传送给高速缓存/主存。

  5. 高速缓存/主存返回所请求的数据字给处理器。

缺页

  1. 处理器产生一个虚拟地址。

  2. MMU生成PTE地址,并从高速缓存/主存请求得到它。

  3. 高速缓存/主存向MMU返回PTE。

  4. PTE中的有效位是零,所以MMU触发了一次异常,传递CPU中的控制到操作系统内核中的缺页异常处理程序。

  5. 缺页处理程序确定出物理内存中的牺牲页,如果这个页面已经被修改了,则把它换出到磁盘。

  6. 缺页处理程序页面调入新的页面,并更新内存中的PTE。

  7. 缺页处理程序返回到原来的进程,再次执行导致缺页的指令。CPU将引起缺页的虚拟地址重新发送给MMU。因为虚拟页面现在缓存在物理内存中,所以就会命中,主存就会将所请求字返回给处理器。

相关视频推荐

搞懂底层原理-linux内核,高级程序员的必经之路:linux内核源码(进程管理、内存管理、网络协议栈、设备驱动、文件系统)icon-default.png?t=N7T8https://www.bilibili.com/video/BV1Pd4y1H7aL/

Linux C/C++开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)

需要C/C++ Linux服务器架构师学习资料加qun812855908获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享

4. 为什么有了高速缓存,还需要TLB呢?

局部性原则保证了在任意时刻, 程序将往往在一个较小的活动页面集合上工作,这个集合叫做工作集或者常驻集。

换句话说, 局部性原则揭示了一个现象:在一段时间内,我们会反复调入或调出同一个或几个虚拟页页面。而且,每次CPU产生一个VA时, MMU就必须查阅PTE,以便将VA翻译为PA, 注意是每次,所以开销很大。

解决方法: 为了消除这样的开销,在MMU中包括了一个关于PTE的小缓存,称为翻译后备缓冲器,TLB(Translation Lookaside Buffer)。

关键点: 所有的地址翻译步骤都是在芯片上的MMU中执行的, 因此执行速度非常快。

说了这么多,下面就是本文的重点,我们看两个例子,虚拟地址是如何转换为物理地址的。

5. MMU是如何完成地址翻译的?

5.1 准备工作

5.1.1 内存系统的基本条件

简单内存系统的地址组成

假设我们有一个简单内存系统,我们做出如下规定:

  • 虚拟地址(VA):14 位

  • 物理地址(PA):12 位

  • 页面大小:64 字节

  • 虚拟页号(VPN):8位

  • 虚拟页面偏移量(VPO):6 位(64 = 2^6)

  • 物理页号(PPN):6位

  • 物理页偏移量(PPO):6位

5.1.2 TLB

TLB

假设TLB 有 16 个条目,并且是 4 路组相连的。TLB 缓存的是页表条目,页表条目是虚拟页号的唯一标识。所以,我们只需要用虚拟页号去访问 TLB。

我们使用 VPN 的低两位(2^2=4)作为组索引。剩下的6位作为标记位。然后用不同的值来初始化 TLB。

左边的红色区域(第一个列)并不是 TLB 的条目,仅仅是为了方便区分是哪一组。

我们只根据索引来查找组,每一个条目都有一个标记位。一个 TLB 条目如果有效,它就含有一个物理地址。

5.1.3 页表

页表的前 16 个条目

现在,我们还需要页表。假设,图中是我们页表的前 16 个条目。每一个页表有一个物理页号和一个有效位。

如果有效位有效,则表示那个虚拟页面对应的物理页面在内存中,并且 PPN 项给出了对应的物理页号。

5.2 产生虚拟地址

CPU产生的虚拟地址

假设 CPU 执行了一条指令,它产生了一个有效地址 0x3d4。它把这个地址传递给了 MMU。

我们需要找出对应的物理地址,然后从缓存或内存中取出数据。

在这个例子中,虚拟页面偏移(VPO)是0x24,虚拟页号(VPN)是 0xf,TLB 索引(TLBI)是虚拟页号的低两位是 0b11,也就是 0x3。TLB 标记位(TLBT)是 3。

TLB

MMU 做的第一件是就是查询 TLB,所以,我们先取出索引位,值为 3。

我们找到第 3 组,我们在第 3 组中找标记位为 3 的表项。

遍历这 4 个条目,有一个标记位为 7 的项,但它不是我们想要的,它的有效位为 0。再往后找,找到一个标记位为 3 并且有效位为 1。

所以,我们在 TLB 中找到了页表条目。页表条目返回这个值。MMU 返回的物理页号是 0x0D。

5.3 构造物理地址

构造物理地址

现在我们可以构造物理地址,PPO的值总是等于VPO的值,可以直接拷贝过来,为0x24。

PPN的值从 TLB 缓存的 PTE 中得到,为0x0d。合在一起构成了物理地址 0x354。

下一步是使用这个物理地址去看高速缓存中有没有这个物理地址的缓存。

5.4 遍历高速缓存

把 0x354送入高速缓存,请求高速缓存返回对应物理地址上的值,在这个例子中,我们只需要返回一个字节。

高速缓存

高速缓存收到请求后,首先去检查高速缓存中是否有块缓存了该字节。

高速缓存先取出物理地址的索引位是 0b00101,也就是 0x5。

接着去第 5 组找。找标记位为 0xd 的项,有一个匹配的标记位且有效位为 1。这就是我们要在高速缓存中找的项。

偏移量是 0,所以我们去请求第五组偏移量为 0 的字节,值为 0x36。

缓存命中,高速缓存把这个字节返回给 MMU, MMU 把它传递给处理器。最后处理器可能把这个字节存储在一个寄存器里。

以上就是一个完整的地址翻译的例子,在这个例子中,并没有出现缺页的情况。

下面我们看一个在缺页异常处理中,是如何完成地址翻译的。

5.5 缺页处理

好了,我们来看下一个例子。这次 CPU 发送给 MMU 的虚拟地址是 0x0020。

虚拟地址0x0020

和之前的例子一样,我们可以得到VPN为0x00,VPO为0x01,TLBI为0,TLBT为0x00。

TLB

第一步是检查 TLB 看是否有页表条目的缓存。

在 TLB 中,如果缓存存在,它应该在第一组,并且它的标记位应该为 0。所以,我们在第 0 组内找标记位为 0 的项。

第一项是 0x03,不匹配,第二项是 0x09,不匹配,第三项是 0x00,匹配,但是有效位为 0。所以,这次 TLB 缓存不命中。

TLB不命中只能去页表中查找

查找缓存失败了,我们只能去内存中去读取页表中对应的页表条目。

查看页表,寻找虚拟页号为 0 的项。检查对应的页表条目,看虚拟页是否在内存中。

虚拟页号为 0 的项的有效位为1,我们就可以得到一个物理页号为0x28。根据物理页号和物理页面偏移量就可以构造出物理地址。

构造物理地址

现在 MMU 拥有了物理地址,就可以将其发送到高速缓存。并请求高速缓存返回对应的物理地址上的一个字节。

构造出的物理地址

高速缓存得到了这个物理地址。它取出对应的索引位,在这个例子中是 0x8。

所以我们去高速缓存的第八组,然后寻找对应的标记位,在这个例子中是0x28。

第八组有一个条目,它的标记位是 24,这里是一次缓存不命中。

所以,缓存就要向内存传递物理地址去得到所需要的字节。相关内容本篇就不再做具体讲解。

6. 总结

虚拟存储器的工作原理是有一些复杂,本文描述的也并不全是最真实的计算机中的工作方式,比如,PTE由一个有效位和一个地址字段组成其实是为了便于理解而假设出来的。

但是这种方式成功的解决了直接使用物理内存会出现的问题。比如,虚拟内存中连续存储解决了物理内存碎片化,资源利用率过低的问题;每个进程只能访问自己独立的用户空间而内核空间是共用的解决了进程间的安全问题;缺页异常和选择牺牲页的算法提高了内存读写的效率等等。

我们应该对虚拟存储器的工作原理有深层次的理解,可以更好的帮助我们理解系统是如何工作的,也可以帮助我们避免在使用malloc这类的管理虚拟存储器的分配程序时遇到的一些错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1406149.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Aspx漏洞总结

第一部分,.NET项目当中的dll都可以进行反编译: 在java中有很多jar包,而在.NET框架中的bin中对应有很多DLL文件,bin下面都是可执行文件,这些文件都是很多代码封装的,想要查看源码,都需要通过反编…

vscode运行python,终端能正常运行,输出(Code Runner)不能正常运行

右键->Run Code报错: [Done] exited with code9009 in 0.111 seconds 我的解决方案:仔细检查自己选的python.exe(解释器)在path环境变量中是否存在或路径是否正确!!! 我就是太自信了&#xf…

STL第三讲

第三讲 stl六大部件:算法是函数模板,其他的是类模板 算法形式:传入两个迭代器(第三个参数可能有:一个比较的准则 算法需要的所有信息从迭代器获取 迭代器分类 基于红黑树的结构是双向迭代器; 基于hash的取…

idea——git提交到本地记录如何退回/删除

目录 一、git提交到本地记录如何退回/删除 一、git提交到本地记录如何退回/删除 git提交到本地记录,如下图【更新】记录,表示本次提交到git本地需要退回/删除的操作: 选中项目,右键点击【git】——>【Show History】——>…

苹果笔记本MacBook电脑怎么卸载软件?三种方法快速卸载软件

苹果笔记本MacBook电脑是一款非常流行的电脑,但是有时候我们可能需要卸载一些不需要的软件。下面是一些简单的步骤,可以帮助您在MacBook电脑上卸载软件。 苹果笔记本MacBook电脑怎么卸载软件?三种实用方法快速卸载软件! 方法一&a…

【数据分享】2023年全球范围土壤数据集HWSD2.0(7个土壤深度/40多种土壤指标)

土壤数据,包括土壤类型、土壤酸碱度、土壤沙含量等指标,对于农业、林业、园艺、环境保护等领域都非常重要。 本次我们为大家带来的是2023年1月份发布的全球范围的土壤数据库。该数据的核心信息如下: ①该数据是基于联合国粮农组织&#xff0…

云HIS为连锁医院机构提供统一医院管理解决方案

云HIS重建统一的信息架构体系,重构管理服务流程,重造病人服务环境,向不同类型的医疗机构提供SaaS化HIS服务解决方案。 云HIS优势 1、云端数据优势 在传统的HIS模式里,数据存于医院本身的服务器机组,一旦发生故障&…

Python学习04—基本图形绘制

通过一个案例来初步认识Python的图形绘制 案例:绘制Python蟒蛇 #PythonDraw.py import turtle turtle.setup(650,350,200,200) turtle.penup() turtle.fd(-250) turtle.pendown() turtle.pensize(25) turtle.pencolor("purple") turtle.seth(-40) for i…

使用WAF防御网络上的隐蔽威胁之代码执行攻击

什么是代码执行攻击? 攻击者通过漏洞在目标系统上运行恶意代码。 这通常是由于应用程序或系统的安全漏洞,如输入验证不足、软件缺陷或配置错误。这些漏洞为攻击者提供了注入和执行恶意代码的机会。 攻击的类型 远程代码执行(RCE&#xff…

linux中用户及用户组信息

1,linux通过用户名和口令来验证用户的身份。 2,几个用户可以组成一个用户组。 3,useradd工具添加用户,groupadd命令添加用户组。 4,history 命令查看用户在Shell中执行命令的历史记录。 5,userdel命令删…

jsjiami.v7介绍

jsjiami.v7介绍 jsjiami.v7是一款在线的JavaScript加密工具,它可以对JavaScript代码进行混淆、压缩、加密等操作,提高代码的安全性和运行效率。jsjiami.v7是jsjiami.v6的升级版,它在2023年1月17日发布,支持新版ES语法&#xff0c…

第二百八十四回

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了下拉刷新组件相关的内容,本章回中将介绍WillPopScope组件.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在本章回中介绍的WillPopScope组件是一种事件拦截类组件,它没有具体…

php:规范小数位数,例:10.00展示为10,10.98展示为10.98

代码 <?php$value 10.98; // 原始的双精度类型值if ($value floor($value)) {$formattedValue number_format($value, 0); // 10.00 转换为 10echo $formattedValue;} else {$formattedValue number_format($value, 2); // 10.98 保持为 10.98echo $formattedValue;} …

某C2鸡肋漏洞分析:你的CS安全吗?

CobaltStrike是一个知名的红队命令与控制框架&#xff0c;采用Beacon <-> TeamServer <-> Client架构。TeamServer存在受限路径穿越写文件与反序列化漏洞&#xff0c;可以被认证后客户端恶意利用。Client存在反序列化漏洞&#xff0c;可以被RogueCS攻击。 山寨威胁…

注册美区(US)IOS AppleId

根据这个操作&#xff1a; 【2024年】五分钟注册美区AppleID&#xff0c;手把手教&#xff0c;稳定且耐用&#xff01; - 知乎 (zhihu.com) 其中需要注意&#xff1a;付款方式&账单地址 的时候需要按照以下操作 总结&#xff1a; 1、通用-语言地区设置为us美国英语 2、…

eNSP学习——配置通过FTP进行文件操作

原理概述&#xff1a; FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是在TCP/IP网络和Internet上最早使用的协议之一&#xff0c;在TCP/IP协议族中属于应用层协议&#xff0c;是文件传输的Internet标准。主要功能是向用户提供本地和远程主机…

[windows]win11任务管理器性能中N卡GPU看不到cuda进程Copy选项找不到cuda选项

正常情况下Copy里面有cuda选项&#xff0c;如图 对于不懂技术的人来说&#xff0c;有个误区&#xff0c;就是上图没有显示cuda选项就一定是cuda不能用吗&#xff1f;显然不是&#xff0c;这个选项只是方便在资源管理器展示cuda使用情况。如果在windows11你设置了一些东西则可能…

【LeetCode每日一题】2765. 最长交替子数组

2024-1-23 文章目录 [2765. 最长交替子数组](https://leetcode.cn/problems/longest-alternating-subarray/)思路&#xff1a; 2765. 最长交替子数组 思路&#xff1a; 计算给定数组中的最大交替子数组的长度。交替子数组是指相邻元素差值符号交替的子数组。代码通过两层循环遍…

为什么RISC-V的指令结构如此的奇怪

为什么RISC-V的指令结构如此的奇怪 RISC-V 有六种不同的指令集&#xff0c;如下图分别为 R-type / I-type / S-type / B-type / U-type / J-type 但是为什么像B-type的指令不将立即数的顺序排成类似于 imm[12:1] 而是要搞成像上图中分开的样子呢&#xff1f; 刚开始学习 RISC-…

Neos的渗透测试靶机练习——DarkHole-2

DarkHole-2 一、实验环境二、开始渗透1. 搜集信息2. git文件泄露3. SQL注入4. 提权 三、总结 一、实验环境 虚拟机软件&#xff1a;VirtualBox 攻击机&#xff1a;kali linux&#xff08;网卡初始为仅主机模式&#xff0c;要有安全意识&#xff09; 靶机&#xff1a;DarkHole-…