MMU合集,一,MMU介绍

文章说明

写一个合集吧,还没写过。关于MMU的,内存管理在系统中是最重要的。 先随便写写,写出来之后,再仔细整理。

介绍

MMU即内存管理单元(Memory Manage Unit),无论是MMU、还是SMMU、IOMMU,其最基本的功能都是负责将虚拟地址转换成物理地址。

MMU是为满足操作系统越来越复杂的内存管理而产生的。

MMU是一个硬件:

  1. 不带 MMU(内存管理单元)的处理器,通常跑裸机程序或 RTOS,被称作“单片机”;
  2. 带 MMU 的处理器,能跑 Linux / Android / WinCE,被视为“嵌入式平台\系统”。

MMU的实物

很早之前的MMU

alt text

MC68451内存管理单元,可与摩托罗拉68010处理器协同使用,

数据手册:https://archive.org/details/bitsavers_motorola68agementUnitApr83_2468167/mode/2up

现在的MMU是一组数字逻辑电路,不是有像外挂总线的IP核一样有硬件框图的。

MMU类型

主要有两种:

  1. CPU侧的MMU

主要是指这个,这是最传统的MMU,集成在CPU内部,负责进程虚拟地址空间的管理、页表转换、权限控制和TLB缓存。常见于x86、ARM、RISC-V等通用处理器。

  1. 设备侧MMU

用于管理外设(如网卡、显卡、存储控制器)对系统内存的访问。它将设备发出的DMA地址转换为物理地址,并提供隔离和保护功能。

典型实现包括:

  • Intel VT-d

Intel的硬件技术,主要是虚拟化方向,功能DMA 重映射 + 中断重映射,非虚拟化是安全增强,提供大页与连续内存,设备间点对点通信(P2P),允许两个支持 P2P 的 NVMe SSD 或 GPU 直接交换数据,绕过主存,减少延迟和带宽占用,这在高性能计算和 AI 训练集群中很常见。

  • AMD IOMMU

AMD的同上

  • ARM SMMU

ARM体系下的IOMMU实现,专门为ARM架构的SoC设计,支持Stage 1(VA→IPA)和Stage 2(IPA→PA)两级转换,常用于虚拟化场景和移动设备/服务器中的外设地址映射。主要是DMA翻译的iommu/smmu。

  • GPU MMU

GPU内部集成的专用MMU,用于管理显存和系统内存的访问,支持分页和大页映射。现代GPU(如NVIDIA、AMD、Intel Arc)都包含独立的MMU以高效处理图形和计算任务。

  • 嵌入式/微控制器MMU

部分低功耗MCU(如ARM Cortex-M系列)使用MPU(内存保护单元)而非完整MMU,提供简单的区域保护和权限控制,但不支持虚拟地址映射。严格来说MPU是MMU的简化变种。

  • 虚拟化MMU(vMMU / 嵌套MMU)

在虚拟机监控器(Hypervisor)中模拟或硬件辅助的MMU,例如Intel EPT(扩展页表)和AMD NPT(嵌套页表),用于加速客户机虚拟地址到宿主机物理地址的转换。

为什么需要MMU

  1. 内存管理复杂度问题

  2. 安全问题

详细说明

在虚拟内存系统中,每一个虚拟页,最终都会映射到物理内存中的某一个页框。而这个“映射关系”,并不是凭空存在的,它需要被明确地记录下来。

操作系统用来做这件事的数据结构,就是页表(Page Table)。

虚拟地址空间是 16GB,而页面大小是 4KB,那么总页数就是 2²²,也就是接近 420 万页。这意味着,一张页表就需要维护 420 万个表项。

如果每个页表项占用 4 字节,那么单张页表就大约需要 16MB 的内存。

而且别忘了,每个进程都有自己独立的虚拟地址空间,也就意味着——每个进程都需要一张自己的页表。

系统中只要有几十个进程,光是页表本身,就可能占掉上百 MB 的内存。这显然是无法接受的。

当然,现代操作系统会通过多级页表等方式来优化这个问题。

MMU工作原理

通过硬件电路自动完成地址翻译工作和权限,状态检查。

页表项

页表项里到底存了什么。

最核心的信息当然是物理页框号,也就是虚拟页最终映射到哪里。

但除此之外,还会有一系列控制位。

比如权限相关的位:只读位可以防止页面被修改,用户/内核位用来区分访问权限,而不可执行位(NX)则是一种重要的安全机制,用来防止恶意代码被执行。

此外,还有一些状态位,通常由 MMU 使用。例如,present(或 valid)位表示这个页是否在内存中;dirty 位表示这个页是否被修改过;accessed 位记录该页是否被访问过;global 位则用于标识该页是否可以在多个进程之间共享。

这里有一个问题:

如果每次访问内存,都必须先通过页表把虚拟地址转换成物理地址,那是不是意味着:那么每一次内存读写操作岂不是都要进行两次内存访问

答案是肯定的。

而这会带来一个严重的问题:访问内存的开销几乎翻倍。而本来,内存相对于 CPU 就已经很慢了,这样一来,性能会变得更加糟糕。

为了解决这个问题,硬件层面引入了一个关键组件:内存管理单元(MMU)。

它负责所有的地址转换工作。处理器发出的每一个虚拟地址,都会先交给 MMU,由它转换成对应的物理地址。

但 MMU 的作用不仅仅是“翻译”。它更像是一个“守门员”:

在地址转换的同时,还会检查访问是否合法,阻止程序访问不属于自己的内存空间,从而保证系统的安全性和稳定性。

为了进一步提升性能,MMU 内部还引入了一层缓存机制,也就是我们常说的 TLB(快表)。

TLB 本质上是一个专门用于缓存页表项的小型高速缓存。它保存的是最近使用过的虚拟页到物理页框的映射关系。

MMU工作流程

TLB

TLB 是一个高速缓存,存储最近访问的虚拟地址到物理地址的映射。TLB 可以加速地址转换,如果地址映射已被缓存,直接返回物理地址,可以省去麻烦的翻译地址计算。

总体流程如下:

alt text

参考:

arm官方的:

https://support.arm.com/documentation/101811/0105/The-Memory-Management-Unit--MMU-

AMD官方的:

https://docs.amd.com/r/en-US/ug585-zynq-7000-SoC-TRM/Memory-Management-Unit-MMU

香山SOC的MMU设计:

https://docs.xiangshan.cc/projects/design/zh-cn/kunminghu-v3/memblock/MMU/

riscv:

https://riscv.org/specifications/ratified/

CVA6(开源 RISC-V 64 位 CPU):

https://cva6.readthedocs.io/en/latest/

https://cva6.readthedocs.io/en/latest/03_cva6_design/MMU.html#memory-management-unit

https://github.com/openhwgroup/cva6

参考

https://mp.weixin.qq.com/s/vqbgsp1PLVt6lXvBYcsBEw

posted @ 2026-08-25 10:20  杨旭0324  阅读(15)  评论(0)    收藏  举报