1. ARM MMU 概述

1.1 MMU 在 ARM 体系结构中的作用

内存管理单元(Memory Management Unit, MMU)是 ARM 处理器中负责虚拟地址到物理地址转换的核心硬件模块。在 ARMv7-A 及 ARMv8-A 架构中,MMU 不仅完成地址翻译,还承担着内存属性控制、权限检查、隔离与虚拟化支持等关键任务。

MMU 核心职责:
  • 地址转换:将 CPU 发出的虚拟地址(VA)转换为物理地址(PA),使操作系统能够为每个进程提供独立的虚拟地址空间。
  • 内存保护:通过页表项中的权限位(AP、XN、PXN)控制内存区域的读/写/执行权限,防止用户态访问内核空间。
  • 缓存与缓冲控制:管理内存区域的 Cache 策略(Write-Back / Write-Through)和共享属性(Non-shareable / Inner Shareable / Outer Shareable)。
  • 虚拟化支持:在虚拟化场景下,MMU 支持两阶段地址转换(Stage-1 + Stage-2),实现 Guest OS 与 Hypervisor 的地址空间隔离。
ARM MMU 系统位置与核心功能 ARM MMU 系统位置与核心功能 CPU Core 发出 VA VA MMU 地址转换 权限检查 属性控制 查询 TLB 页表缓存 未命中 Page Table Walk 硬件自动遍历 PA Memory System DRAM / Cache 说明: MMU 位于 CPU 与内存系统之间,负责 VA→PA 转换。TLB 缓存最近使用的页表项以加速转换,未命中时由硬件自动执行页表遍历。

1.2 虚拟地址到物理地址的映射原理

ARM MMU 采用多级页表结构实现虚拟地址到物理地址的映射。以 ARMv8-A 的 4KB 页面、48 位虚拟地址空间为例,地址转换过程分为以下步骤:

  1. TTBRx 基址寄存器:CPU 从 TTBR0_EL1(用户空间)或 TTBR1_EL1(内核空间)获取一级页表的物理基地址。
  2. Level 0 索引:虚拟地址 [47:39] 作为索引,在一级页表中找到下一级页表的物理地址。
  3. Level 1 索引:虚拟地址 [38:30] 作为索引,在二级页表中找到下一级页表的物理地址。
  4. Level 2 索引:虚拟地址 [29:21] 作为索引,在三级页表中找到下一级页表的物理地址。
  5. Level 3 索引:虚拟地址 [20:12] 作为索引,在四级页表中找到最终的页表项(PTE),其中包含物理页帧号(PFN)。
  6. 页内偏移:虚拟地址 [11:0] 直接作为物理页内的偏移量,与 PFN 拼接得到完整的物理地址。
关键概念:ARMv8-A 支持 4KB、16KB 和 64KB 三种页面粒度。页面越大,页表级数越少(64KB 页面只需 3 级页表),但内存内部碎片可能增加。实际系统中 4KB 页面最为常用。
虚拟地址到物理地址转换流程 虚拟地址到物理地址转换流程(ARMv8-A 4KB 页面) 虚拟地址 (VA) 分解 [47:39] L0 索引 | [38:30] L1 索引 | [29:21] L2 索引 | [20:12] L3 索引 | [11:0] 页内偏移 TTBRx 基址 获取 L0 表基址 Level 0 页表 VA[47:39] 索引 Level 1 页表 VA[38:30] 索引 Level 2 页表 VA[29:21] 索引 Level 3 页表 VA[20:12] 索引 页表项 (PTE) 获取 PFN 物理地址 = PFN + 页内偏移 说明: 页表遍历由 MMU 硬件自动完成,无需软件干预。每级页表项指向下一级页表的物理基址,最终 L3 页表项包含物理页帧号。

1.3 TLB 与页表缓存

TLB(Translation Lookaside Buffer)是 MMU 内部的高速缓存,用于存储最近使用的虚拟地址到物理地址的映射关系。由于页表遍历需要多次内存访问(4KB 页面需要 4 次),TLB 的存在大幅降低了地址转换的平均延迟。

TLB 与页表缓存关键特性对比
特性 TLB 页表缓存 (Page Table Cache)
存储内容 完整的 VA→PA 映射 + 属性 中间级页表的物理地址
命中延迟 1-2 个 CPU 周期 减少页表遍历次数
失效粒度 单条 TLB 项或全部(TLBI 指令) 随 TLB 失效或上下文切换
硬件管理 MMU 自动填充与替换 MMU 内部维护
软件控制 TLBI 指令失效、ASID 区分 无直接软件接口
TLB 一致性要点:当操作系统修改页表(如解除映射、更改权限)后,必须执行 TLB 失效操作(如 TLBI VAE1IS 或 DSB + ISB 序列),否则 MMU 可能使用过时的 TLB 项,导致权限绕过或访问错误地址。在 ARMv8-A 中,ASID(Address Space ID)机制允许在上下文切换时保留 TLB 中属于其他进程的项,减少 TLB 刷新开销。
TLB 结构与命中/未命中流程 TLB 结构与命中/未命中流程 TLB 结构 VA Tag | ASID | PA PFN | 权限 | 属性 VA Tag | ASID | PA PFN | 权限 | 属性 VA Tag | ASID | PA PFN | 权限 | 属性 ... 更多项(全相联/组相联) VA 查询 TLB 命中 直接返回 PA TLB 未命中 触发页表遍历 硬件页表遍历 填充 TLB 后重试 说明: TLB 命中时地址转换仅需 1-2 周期;未命中时需 4 次内存访问完成页表遍历,延迟可达数十周期。

1.4 地址空间与翻译机制概览

ARMv8-A 支持 64 位虚拟地址空间,但当前实现通常使用 48 位(256 TB 用户空间 + 256 TB 内核空间)。地址翻译机制根据异常级别(EL)不同而有所差异:

  • EL0 (用户态):使用 TTBR0_EL0 指向的页表,ASID 由 CONTEXTIDR_EL0 提供。
  • EL1 (操作系统内核):使用 TTBR0_EL1(用户空间)和 TTBR1_EL1(内核空间),通过虚拟地址的最高位选择(高地址使用 TTBR1)。
  • EL2 (Hypervisor):支持两阶段翻译,Stage-1 由 Guest OS 管理,Stage-2 由 Hypervisor 管理。
  • EL3 (安全监控):通常使用固定的 1:1 映射,用于安全启动和电源管理。
兼容性适配要点:
  • 不同 ARM 架构版本(ARMv7-A vs ARMv8-A)的页表项格式不同,移植操作系统时需要重新配置页表描述符。
  • ARMv8-A 的 64 位页表项使用 Descriptor 类型(Table/Page/Block)和 Attr 字段,与 ARMv7-A 的短描述符格式不兼容。
  • 虚拟化场景下,Stage-2 页表项使用不同的权限位(S2AP、XN)和属性编码,不能直接复用 Stage-1 页表项。