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 的地址空间隔离。
1.2 虚拟地址到物理地址的映射原理
ARM MMU 采用多级页表结构实现虚拟地址到物理地址的映射。以 ARMv8-A 的 4KB 页面、48 位虚拟地址空间为例,地址转换过程分为以下步骤:
- TTBRx 基址寄存器:CPU 从 TTBR0_EL1(用户空间)或 TTBR1_EL1(内核空间)获取一级页表的物理基地址。
- Level 0 索引:虚拟地址 [47:39] 作为索引,在一级页表中找到下一级页表的物理地址。
- Level 1 索引:虚拟地址 [38:30] 作为索引,在二级页表中找到下一级页表的物理地址。
- Level 2 索引:虚拟地址 [29:21] 作为索引,在三级页表中找到下一级页表的物理地址。
- Level 3 索引:虚拟地址 [20:12] 作为索引,在四级页表中找到最终的页表项(PTE),其中包含物理页帧号(PFN)。
- 页内偏移:虚拟地址 [11:0] 直接作为物理页内的偏移量,与 PFN 拼接得到完整的物理地址。
关键概念:ARMv8-A 支持 4KB、16KB 和 64KB 三种页面粒度。页面越大,页表级数越少(64KB 页面只需 3 级页表),但内存内部碎片可能增加。实际系统中 4KB 页面最为常用。
1.3 TLB 与页表缓存
TLB(Translation Lookaside Buffer)是 MMU 内部的高速缓存,用于存储最近使用的虚拟地址到物理地址的映射关系。由于页表遍历需要多次内存访问(4KB 页面需要 4 次),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 刷新开销。
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 页表项。