写给新手的MMU工作原理

简介: 写给新手的MMU工作原理

很多人接触Linux的内存管理是从malloc()这个C语言库函数开始,也是从那时开始就知道了虚拟内存的概念。但很多人可能并不知道虚拟地址是如何转换成物理地址的,今天带你搞懂虚拟地址到物理地址的转换过程,这其实也是MMU的工作原理。

1、预备知识

我们知道,在Linux中,每个进程都有自己独立的地址空间,且互不干扰。每个进程的地址空间又分为用户空间和内核空间,但这些地址空间使用的都是虚拟地址,它们和物理地址空间关系是怎样的呢?虚拟地址空间和物理地址空间的关系如下:

对于不同的进程,面对的都是同一个内核,其内核空间的地址对应的物理地址都是一样的,因此进程1和进程2中内核空间都映射到了相同的物理内存PA1上。

而不同进程的用户空间是不一样的,即便相同的虚拟地址,也会被映射到不同的物理地址上。如图中两个进程相同用户空间的地址0x123456分别被映射到了PA2和PA3物理地址上。

那么如何完成上述虚拟地址到物理地址的转换呢?

完成虚拟地址到物理地址的转换,我们需要借助一个硬件——MMU。

MMU: Memory manager unit,内存管理单元,负责将虚拟地址(VA)转为物理地址(PA)。

在介绍MMU是如何将虚拟地址转为物理地址之前,我们需要了解一些内存管理机制。

2、分页机制

在Linux系统上,现在用到的内存管理机制,大部分是分页机制。在分页机制出现之前,还出现过动态分区法、分段机制。

动态分区法是还没用引入虚拟地址之前使用的,使用的都是物理内存,属于非常早期的机制。分段机制则引入了虚拟地址的概念,而分页机制在分段机制后出现,主要解决分段机制内存碎片的问题。本篇以分页机制讲解虚拟地址到物理地址的转换,下面介绍分页机制的一些基本概念。

分页机制的基本概念:

  • 分页:将内存划分为固定长度的单元,每个单元就是一页
  • 页:对于虚拟地址空间,将地址空间划分为固定大小单元的单元,每个单元称为一页
  • 页帧:对于物理地址空间,将地址空间分为固定大小的单元,每个单元称为页帧
  • VPN:Virtual Page Number,虚拟页面号
  • PFN:Physical Frame Number,物理页帧号

分页管理内存的核心问题就是虚拟地址页到物理地址页帧的映射关系

3、虚拟地址到物理地址转换过程

虚拟地址和物理地址都被划分了两部分:

虚拟地址由虚拟页面号VPN和虚拟地址偏移VA offset两部分组成。同样,物理地址由物理页帧号PFN和物理地址偏移PA offset两部分组成。

虚拟地址转换成物理地址时,需要将VPN转成PFN。PA offset通常就是VA offset。

所以物理地址 = PFN + VA offset

这里的核心就是VPN到PFN的映射,而VPN到PFN的映射关系是通过页表记录。就是说,页表存储了VPN和PFN的映射关系,MMU根据VPN,在页表中找到PFN,再把PFN和VA offset相加,就得到了物理地址,从而将虚拟地址转为物理地址。

这里要区分一下,页表存储了VA到PA的映射关系,所以说找到页表就找到了物理地址。但是这个页表是软件提供的,MMU只负责将虚拟地址翻译成物理地址,翻译的依据就是页表,MMU本身不负责创建页表。所以说,在开启MMU之前,系统就要提前建立好虚拟地址到物理地址的映射关系,然后保存到页表中,这样开启MMU时,MMU才能正确找到对应的物理地址。

4、页表在哪

页表都存储在物理内存中, MMU将虚拟地址转换为物理地址,需要访问物理内存中对应的页表。

实际上,页表通常就是用一个数组来表示。

这里可能会一些疑问:

疑问:放到物理内存,每次转换都要访问内存,速度不慢吗?

答:慢。怎么解决呢?如果有cache是不是就很快了?是的,这块cache就叫TLB。

疑问:都放到物理内存,占用物理内存空间不大吗?

答:大,怎么解决?多级页表+缺页异常!多级页表可以减少内存占用,而通常只需将一级页表存储到物理内存,查找的时候,找不到二级页表,触发一个缺页异常,这时再分配页表,从而节省内存。

关于页表放到物理内存的问题,涉及到cache和其他的一些知识,内容很多且比较复杂,暂时不深究,知道页表是放在内存中的即可。

5、MMU如何知道页表在哪

前面说页表存储在物理内存中,那么MMU怎么知道这个页表在内存中的具体地址呢?

通常CPU会提供一个页表基址寄存器给操作系统使用,用于给MMU指示页表的基地址。不同处理器架构对应的寄存器也不一样:

x86:CR3(Control Register 3)

ARM-v8:系统寄存器TTBR(Translation Table Base egister)

RISC-V:SATP(Supervisor Address Translation and Protection)

页表基址寄存器存储了第一级页表的基地址,通过访问该寄存器,就能知道页表在那个位置。

6、多级页表转换过程

实际使用中,都是用多级页表来存储虚拟地址和物理地址的映射关系,

以二级页表为例(假设是32位系统),其虚拟地址转换为物理地址的过程如图所示:

PGD:Pgea Global Directory,全局页目录,存储了下一级页表的基地址

PTE:Page Table Entrys,页表入口,PTE才是真正存储了物理地址的页表

VA到PA的转换过程:

MMU通过访问页表基址寄存器,得到一级页表PGD的基地址,再结合虚拟地址中的PGD index找到了下一级页表PTE的基地址;得到了PTE的基址,再结合虚拟地址中的PTE index找到PFN,然后再和VA相加得到物理地址。

这里需要注意,使用多少级的页表、以及虚拟地址、物理地址的格式、PTE的格式等等,与32系统还是64位系统有关,也与处理器的架构有关,需要根据不同系统、不同处理器架构分析。

但是MMU工作原理都是一样的,不管是二级页表、三级页表还是四级页表,都是通过第一级页表找到第二级页表,通过第二级页表找到第三级页表......最终找到物理地址。只要明白了MMU的工作原理,分析其他的页表也是大同小异。

总结

本文带大家了解了虚拟地址和物理地址的一些概念,以及MMU将虚拟地址转为物理地址的过程,相信通过以上内容,对虚拟地址、物理地址、MMU、多级页表等这些概念都不陌生了。

本文只讲解了MMU是通过页表将虚拟地址转为了物理地址的,但没有说页表是如何创建的,因为页表的创建每个处理器架构都不一样,本文只讲通用性的MMU原理,后续再深入分析页表创建。


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
Linux Shell 虚拟化
RISC-V 入门笔记(新手必看!)
RISC-V 入门笔记(新手必看!)
|
8月前
|
并行计算 编译器 调度
GPU红绿阵营对决:CUDA与ROCm内核调度机制深度漫游指南
本文深入剖析GPU内核(Kernel)在CUDA与ROCm异构生态中的底层交互机制,涵盖命令包生成、环形队列投递、Doorbell通知、硬件调度等关键环节;对比NVIDIA的Warp/SIMT与AMD的Wavefront/HSA架构差异;详解内存优化、延迟掩盖、寄存器级通信及Graph静态调度等极限性能调优策略,助工程师穿透抽象,直抵算力本质。(239字)
1175 6
|
7月前
|
存储 缓存 自然语言处理
从零搭建企业私有知识库:RAG + 大模型实战(附完整代码)
本文详解如何用RAG技术构建企业私有知识库:支持PDF/TXT/DOCX等文档上传、向量化存储与智能问答,让大模型精准理解业务数据,兼顾数据隐私、领域专业性与实时性,附完整代码与部署方案。
11575 1
|
9月前
|
安全 Linux iOS开发
IDA Pro 9.3 正式版发布 - 强大的反汇编程序、反编译器和多功能调试器
IDA Pro 9.3 (macOS, Linux, Windows) - 强大的反汇编程序、反编译器和多功能调试器
19622 9
IDA Pro 9.3 正式版发布 - 强大的反汇编程序、反编译器和多功能调试器
|
10月前
|
存储 弹性计算 人工智能
阿里云服务器租用价格表(2026年最新)轻量、ECS、GPU 收费标准
阿里云服务器涵盖轻量应用服务器、云服务器ECS及GPU服务器三大类,适配从个人开发到企业核心业务的不同需求,价格差异显著。以下结合最新收费信息,用通俗语言梳理各机型配置与价格,包含优惠活动、续费规则及附加资源成本,帮助用户精准把控预算。
2560 4
|
存储 移动开发 算法
ARM 常用汇编指令
下面是ARM架构中常用汇编指令的总结,涵盖数据处理、数据传输、分支跳转、堆栈操作等类别,方便你快速查阅和理解。
710 105
|
存储 机器学习/深度学习 缓存
vLLM 核心技术 PagedAttention 原理详解
本文系统梳理了 vLLM 核心技术 PagedAttention 的设计理念与实现机制。文章从 KV Cache 在推理中的关键作用与内存管理挑战切入,介绍了 vLLM 在请求调度、分布式执行及 GPU kernel 优化等方面的核心改进。PagedAttention 通过分页机制与动态映射,有效提升了显存利用率,使 vLLM 在保持低延迟的同时显著提升了吞吐能力。
10325 22
vLLM 核心技术 PagedAttention 原理详解
|
存储 安全
什么是内存管理单元(MMU)?
【8月更文挑战第23天】
1582 0
|
数据库 C++
【数据结构进阶】红黑树超详解 + 实现(附源码)
本文深入探讨了红黑树的实现原理与特性。红黑树是一种自平衡二叉搜索树,通过节点着色(红/黑)和特定规则,确保树的高度接近平衡,从而实现高效的插入、删除和查找操作。相比AVL树,红黑树允许一定程度的不平衡,减少了旋转调整次数,提升了动态操作性能。文章详细解析了红黑树的性质、插入时的平衡调整(变色与旋转)、查找逻辑以及合法性检查,并提供了完整的C++代码实现。红黑树在操作系统和数据库中广泛应用,其设计兼顾效率与复杂性的平衡。
4476 3
|
数据采集 数据挖掘 数据处理
Pandas技巧:如何将一列数据轻松分隔为两列
Pandas技巧:如何将一列数据轻松分隔为两列
1162 1