【MMU】认识 MMU 及内存映射的流程

news2024/11/27 6:35:31

MMU(Memory Manager Unit),是内存管理单元,负责将虚拟地址转换成物理地址。除此之外,MMU 实现了内存保护,进程无法直接访问物理内存,防止内存数据被随意篡改。


目录

一、内存管理体系结构

1、认识框架

2、虚拟地址到物理地址的转换流程

二、页命中

三、缺页

四、虚拟地址与物理地址的多级映射

1、第一级:PGD 页目录查询(VA => PTE)

2、第二级:PTE 页表查询(PTE => PA 高20位)

3、物理地址拼接(获得完整 PA)


一、内存管理体系结构

1、认识框架

MMU:

  • TLB模块:用于缓存从虚拟地址到物理地址的转换结果
  • TWU模块:负责完成页表的查过程

Cache:

        高速缓存缓存某物理地址对应的内容

页表:

  • 将虚拟地址转换为物理地址
  • 管理CPU对物理页的访问(即检查是否具备读、写、可执行等权限)
  • 隔离地址空间(隔离各个进程的地址空间,使其互不影响)

PTE: PTE 是一种数据结构,用于描述虚拟内存和物理内存之间的映射关系。通过使用PTE,CPU可以根据虚拟地址获取到物理内存地址,同时检查该地址的访问权限。

  • 物理页地址:虚拟内存所映射的物理内存页的地址
  • 访问权限:指示当前页面是否可读、可写、可执行等权限信息
  • 脏位:标记页面是否被修改过,以支持页面置换
  • 共享位:指示页面是否可以被共享
  • 缓存位:用于控制页面的缓存策略,例如是否可以缓存到Cache

2、虚拟地址到物理地址的转换流程

MMU 先检查 TLB 是否命中(即TLB 是否保存了该虚拟地址和物理地址的映射)

  • 如果 TLB 命中了,继续查询该物理地址的内容是否存在于 cache 中。
    • 若cache命中,直接取出内容返回给处理器
    • 若cache没有命中,进一步访问物理内存获取相应的内容
  • 如果 TLB 没有命中,MMU 通过 TWU 查询页表,翻译虚拟地址得到物理地址(具体过程请看下面“页命中”部分)

注意:这里存在一个特殊的过程“缺页”,放到后面介绍

二、页命中

页命中就是 MMU 成功将虚拟地址转换为物理地址,获取到物理地址对应内容的过程。(下图是将过程简化以后的结果,这里假设TLB没有命中

ps:PTE 是一种数据结构,用于描述虚拟内存和物理内存之间的映射关系,包含的内容有物理内存页的地址、访问权限、臧伟

① 处理器对虚拟地址(VA) 进行访问

② MMU 通过TWU遍历物理内存页表中的 PTEA(PTE地址)

③ 物理内存返回 PTE(检查对应物理地址是否存在,或者是否具备访问权限)

④ MMU 通过PTE 映射物理地址,将其传给高速缓存或物理内存

⑤ 高速缓存或物理内存返回数据给处理器

三、缺页

与页命中相反,当MMU没有找到虚拟地址对应的物理地址时,这个时候为防止系统崩溃,需要采取补救措施。这种异常便是“缺页”(这里同样假设TLB没有命中

① 处理器对虚拟地址(VA) 进行访问

② MMU 通过TWU遍历物理内存页表中的 PTEA(PTE地址)

③ 物理内存返回 PTE(有效位为0,触发异常,CPU响应异常,运行相应的异常处理程序)

补救措施:

④ 选出物理内存中的牺牲页,如果该页被修改过,先保存到磁盘

⑤ 异常处理程序从磁盘中加载新的页面,并更新触发异常的PTE

⑥ 异常处理程序返回到原来的进程,重新发送一个VA 给MMU(接下来就是“命中页”的流程了)

牺牲页可以选择长时间没被使用的页,因为后面要用新页内容覆盖该页,所以要检查有没有被修改过,如果被修改过,需要更新到磁盘

四、虚拟地址与物理地址的多级映射

上面了解了虚拟地址到物理地址的大致转换过程,但是我们要MMU 是如何根据虚拟地址 VA 获得 PTE?又是如何根据 PTE 得到最终的物理地址 PA 的 ?

下面我们要了解便是 VA 到 PA 的具体转换过程。不同系统采取的映射策略会有所不同。(下面ARM 32bit为例)

  • Linux x86      :三级映射。PGD => PMD => PTE
  • Linux x86_64:四级映射。PGD => PUD => PMD => PTE
  • ARM 32bit     :  两级映射。PGD => PTE

其中:

  • PGD:Page Global Directory
  • PUD:Page Upper Directory
  • PMD:Page Middle Directory
  • PTE:Page Table Entry

1、第一级:PGD 页目录查询(VA => PTE)

虚拟地址 VA 的高 12 位(bit[31:20])可作为访问一级页表的索引值,基地址保存在 TTBRx 寄存器中。从PGD 中获取到的是二级页表 PTE 的基地址(起始地址)

2、第二级:PTE 页表查询(PTE => PA 高20位)

虚拟地址 VA 的 bit[19:12] 可作为访问二级页表的索引值,基地址来自 PGD 获得的页表项。从PTE 中获取到的是物理地址PA的高20位

 

3、物理地址拼接(获得完整 PA)

完整的物理地址 PA = 从PTE获得 PA 高 20 位 + 虚拟地址 VA 的bit[11:0] 

参考文章:

一文搞懂MMU工作原理 - 知乎 (zhihu.com)

linux中的pte是什么_linux中的pte是什么意思-PHP博客-李雷博客 (mdaima.com)

ARM32 页表映射过程 - DF11G - 博客园 (cnblogs.com)

MMU内存管理单元的工作原理和作用-电子发烧友网 (elecfans.com)

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

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

相关文章

kuboard安装和使用

windows平台下使用docker和docker-compose部署Kuboard,并添加Docker Desktop for windows的k8s单机集群 使用docker安装 docker run -d \--restartunless-stopped \--namekuboard \-p 80:80/tcp \-p 10081:10081/tcp \-e KUBOARD_ENDPOINT"http://内网IP:80&…

常量池-JVM(十九)

上篇文章说gc日志以及arthas。 Arthas & GC日志-JVM(十八) 一、常量池 常量池主要放两大类:字面量和符号引用。 字面量就是由字母、数字等构成的字符串或者数值常量。 符号引用主要包含三类常量。 类和接口的全限定名。字段的名称和…

线程安全问题的原因和解决方案

前言 如果某个代码,在单线程执行下没有问题,在多线程执行下执行也没有问题,则称“线程安全”,反之称“线程不安全”。 目录 前言 一、简述线程不安全案例 二、线程安全问题的原因 (一)(根本…

JMeter处理接口签名之BeanShell实现MD5加密

项目A需要给项目B提供一个接口,这个接口加密了,现在需要测试这个接口,需要怎么编写脚本呢?实现接口签名的方式有两种:BeanShell实现MD5加密和函数助手实现MD5加密,之前已经分享过了函数助手实现MD5加密&…

国产水声功率放大器ATA-L50在水下通信领域中的应用

水下通信是指在水下环境中进行信息交流和传递的技术。由于水下环境的特殊性,水下通信面临着诸多挑战,如水压、水体的吸收和散射等。然而,随着科技的发展,水下通信技术已经取得了长足的进步,并广泛应用于海洋资源开发、…

【IMX6ULL驱动开发学习】01.IMX6ULL驱动开发_编写第一个hello驱动(不涉及硬件操作)

目录 一、驱动程序编写流程 二、代码编写 2.1 驱动程序hello_drv.c 2.2 测试程序 2.3 编写驱动程序的Makefile 三、上机实验 3.1 NFS 挂载 3.2 测试示例 一、驱动程序编写流程 构造file_operations结构体 在里面填充open/read/write/ioctl成员 注册file_operations结…

深度学习(35)—— StarGAN(2)

深度学习(34)—— StarGAN(2) 完整项目在这里:欢迎造访 文章目录 深度学习(34)—— StarGAN(2)1. build model(1)generator(2&#…

官宣了!Nank南卡耳机签约世界游泳冠军傅园慧!共塑国货好品质

骨传导开放式耳机行业领导品牌Nank南卡今日宣布,将邀请世界游泳冠军傅园慧为品牌形象代言人,Nank南卡对品牌推广大使的选择并非跟随流量的潮向,而是甄选与自身价值观更为相符的游泳冠军。赛场上的傅园慧所体现的不怕输、不放弃,坚…

XXL-Job 具体通过docker 配置,再通过springboot执行注册实现完整流程

【2023】XXL-Job 具体通过docker 配置安装容器,再通过springboot执行注册实现 一、概述二、安装1、拉取镜像2、创建数据库3、创建容器并运行3、查看容器和日志4、打开网页 127.0.0.1:9051/xxl-job-admin/ 三、实现注册测试1、创建一个SpringBoot项目、添加依赖。2、…

源码分析——HashMap(JDK1.8)源码+底层数据结构分析

文章目录 HashMap 简介底层数据结构分析JDK1.8之前JDK1.8之后 HashMap源码分析构造方法put方法get方法resize方法 HashMap常用方法测试 HashMap 简介 HashMap 主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一。 JDK1.8 之前 HashM…

品牌战略的力量与影响:如何利用品牌战略抢占市场的制高点

商海如战场,如何在众多品牌中脱颖而出?答案可能不仅仅在于有一个出色的产品或服务,还需要一个强大的品牌战略。这不仅是一个标志或广告活动,而是决定企业命运的关键。那么什么是品牌战略?品牌战略包含哪些内容?品牌战略又能给企业带来哪些…

CMake良心教程(1)手把手教你入门!

目录 一.CMake是什么?有什么用? 二.环境配置 2.1CMake安装 2.2MinWG安装 三.构建最小项目 3.1项目的构建 3.2外部构建与内部构建 四.CMakeLists.txt语法介绍 4.1 project关键字 4.2 set 与 PROJECT_NAME 4.3 MESSAGE关键字 4.4 ADD_EXECUTABL…

浅谈建筑能耗管理云平台系统的分析与设计

安科瑞 华楠 摘要:本文以建筑能耗为研究对象,分析并设计了基于云服务平台的建筑能耗管控系统。该系统可辅助企业多维度(即纵向时间纬度、不同专业指标纬度、不同权限纬度等)监测企业建筑能耗情况,并基于其对海量数据、…

马氏杆法检查斜视

使用 检查水平向斜视时,使用水平向马氏杆检查;重直向斜视时,使用重直问马氏杆;检查旋转斜视时,使用双马氏杆. 检查水平向斜视 双眼屈光不正全矫 双眼同时打开,右眼前加水平向马氏杆,左眼前不加 双眼同时观察点光源&…

extern关键字的使用

test.c int add(int a, int b) {return a b; }main.cpp #include <iostream> using namespace std;//方法一&#xff1a; //#include "test.c"//方法二&#xff1a; extern "C" int add(int a, int b); //如果直接在C程序中调用C编译过的函数&…

边写代码边学习之批归一化(BatchNormalization)

1. 为什么要归一化 归一化&#xff08;Normalization&#xff09;是指将不同类型、不同取值范围等不同的数据按照一定的规则统一转化为相同的范围&#xff0c;使得数据在同一数值区间内比较、处理更加合理、有意义。归一化可以消除数据特征之间的量纲差异&#xff0c;使得每个…

热评国内AI四小龙:此一时彼一时,彼此彼此

引言&#xff1a;阿里“清仓”全部持股 商汤科技表示“没啥事” 【科技明说 &#xff5c; 热点关注】 作为国内AI领域的知名科技上市公司&#xff0c;商汤科技SenseTime的一举一动都牵动着业内人士的心。 然而&#xff0c;商汤科技的财报表现没有出奇制胜&#xff0c;却让不…

史上最细,自动化测试-logging日志采集详细实战(一)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 日志概述 1、日志…

Python爬虫在框架下的合规操作与风险控制

大家好&#xff01;作为一名专业的爬虫代理供应商&#xff0c;我今天要和大家分享一些关于Python爬虫在法律框架下的合规操作与风险控制的知识。随着互联网的发展&#xff0c;数据爬取在商业和研究领域扮演着重要的角色&#xff0c;但我们也必须遵守相关法律和规定&#xff0c;…

Android界面设计与用户体验

Android界面设计与用户体验 1. 引言 在如今竞争激烈的移动应用市场&#xff0c;提供优秀的用户体验成为了应用开发的关键要素。无论应用功能多么强大&#xff0c;如果用户界面设计不合理&#xff0c;用户体验不佳&#xff0c;很可能会导致用户流失。因此&#xff0c;在Androi…