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

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.hqwc.cn/news/66138.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AutoxJS脚本保姆级教程

目录 引言 准备工作 脚本开发 邮件提示(不使用邮件推送的可以跳过这步) 节假日判断(不需要判断节假日的可以跳过) 问题及技巧归总 JS语法错误:软件更新 按钮或组件无法找到 使用定时器等待组件出现 root环境下…

大数据平台中元数据库—MySQL的异常故障解决

本文的主要目标是解决大数据平台中元数据库MySQL的异常故障。通过分析应用响应缓慢的问题,找到了集群组件HIVE和元数据库MySQL的原因。通过日志分析、工具检测和专家指导等一系列方法, 最终确定问题的根源是大数据集群中租户的不规范使用所导致&#xff…

深度学习关键要素:数据集汇总与分享

引言 在深度学习的应用中,数据被认为是最重要的因素之一。因此,选择一个好的数据集对于深度学习的成功至关重要。在选择数据集时,不仅需要关注数据量的大小、多样性以及质量,还要考虑数据集是否代表了所研究问题的真实情况。本文…

保持城市天际线(力扣)贪心 JAVA

给你一座由 n x n 个街区组成的城市,每个街区都包含一座立方体建筑。给你一个下标从 0 开始的 n x n 整数矩阵 grid ,其中 grid[r][c] 表示坐落于 r 行 c 列的建筑物的 高度 。 城市的 天际线 是从远处观察城市时,所有建筑物形成的外部轮廓。…

面试总结-webpack/git

说说你对webpack的理解 webpack 是一个静态模块打包器,整个打包过程就像是一条生产线,把资源从入口放进去,经过一系列的加工(loader),最终转换成我们想要的结果,整个加工过程还会有监控&#x…

云计算——存储虚拟化功能

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 目录 前期回顾 前言 一.存储虚拟化功能 1.精简磁盘和空间回收 2.快照 (1&a…

0基础学C#笔记08:插入排序法

文章目录 前言一、过程简单描述:二、代码总结 前言 我们在玩打牌的时候,你是怎么整理那些牌的呢?一种简单的方法就是一张一张的来,将每一张牌插入到其他已经有序的牌中的适当位置。当我们给无序数组做排序的时候,为了…

Mysql中如果建立了索引,索引所占的空间随着数据量增长而变大,这样无论写入还是查询,性能都会有所下降,怎么处理?

索引所占空间的增长确实会对MySQL数据库的写入性能和查询性能造成影响,这主要是由于索引数据过多时会导致磁盘I/O操作变得非常频繁,从而使性能下降。为此,可以采取以下几种方式来减缓这种影响: 1. 限制索引的大小:可以…

Android 视频播放器dkplayer

gihub地址: https://github.com/Doikki/DKVideoPlayer GitHub - Doikki/DKVideoPlayer: Android Video Player. 安卓视频播放器,封装MediaPlayer、ExoPlayer、IjkPlayer。模仿抖音并实现预加载,列表播放,悬浮播放,广…

定量分析计算51单片机复位电路工作原理 怎么计算单片机复位电容和电阻大小

下面画出等效电路图 可以知道单片机内必然有一个电阻RX,为了简化分析,我们假设他是线性电阻(不带电容,电感的支路) 还有一个基础知识: 电容器的充电放电曲线: 还需要知道电容电压的变化是连续…

Android Jetpack Compose 中的分页与缓存展示

Android Jetpack Compose 中的分页与缓存展示 在几乎任何类型的移动项目中,移动开发人员在某个时候都会处理分页数据。如果数据列表太大,无法一次从服务器检索完毕,这就是必需的。因此,我们的后端同事为我们提供了一个端点&#…

11、Nvidia显卡驱动、CUDA、cuDNN、Anaconda及Tensorflow Pytorch版本

Nvidia显卡驱动、CUDA、cuDNN、Anaconda及Tensorflow-GPU版本 一、确定版本关系二、安装过程1.安装显卡驱动2、安装CUDA3、安装cudnn4、安装TensorFlow5、安装pytorch 三、卸载 一、确定版本关系 TensorFlow Pytorch推出cuda和cudnn的版本,cuda版本推出驱动可选版本…