多级页表地址映射设计与ARM硬件MMU兼容性适配 - 第1节

1.1 MMU 的核心作用

内存管理单元(Memory Management Unit, MMU)是处理器内部负责虚拟地址到物理地址转换的硬件模块。它位于 CPU 核心与内存控制器之间,是操作系统实现进程隔离、虚拟内存、内存保护和页式存储的关键硬件基础。

MMU 三大核心职责:
  • 地址转换:将 CPU 发出的虚拟地址(VA)实时转换为物理地址(PA),再发送给内存控制器。
  • 内存保护:检查当前访问权限(读/写/执行、用户态/内核态),阻止非法访问。
  • 缓存控制:管理页表项中的缓存属性(Cacheable、Bufferable、Shareable),控制数据一致性。
MMU 在系统中的位置与作用 CPU 核心 MMU 地址转换 + 权限检查 物理内存 页表 虚拟地址 物理地址 查页表 💡 关键理解 MMU 对软件透明:操作系统配置页表,MMU 硬件自动完成转换。

1.2 虚拟地址与物理地址

现代操作系统让每个进程拥有独立的虚拟地址空间,通过 MMU 映射到共享的物理内存。这种抽象隔离了进程,简化了内存管理。

概念 定义 特点
虚拟地址(VA) CPU 核心发出的地址,由指令指针或访存指令产生 每个进程独立,大小由处理器位宽决定(如 32 位 4GB、48 位 256TB)
物理地址(PA) 实际发送到内存控制器的地址,对应 DRAM 中的物理存储单元 系统全局唯一,受限于实际安装的内存容量
页(Page) 虚拟地址空间划分的固定大小块(典型 4KB) 页是地址转换和保护的最小粒度
页帧(Page Frame) 物理内存划分的与页等大的块 页帧是物理内存分配的最小单位
地址空间大小对比: 32 位系统虚拟地址空间 4GB,物理地址通常 ≤4GB;64 位系统(ARMv8-A)虚拟地址空间可达 48 位(256TB),物理地址支持 40~48 位。
虚拟地址空间 → 物理地址空间映射 虚拟地址空间 进程 A 页表 进程 B 页表 内核空间 物理地址空间 页帧 0 页帧 1 页帧 2 页帧 3 MMU 映射

1.3 地址转换的基本流程

当 CPU 执行一条访存指令(如 LDR R0, [R1])时,MMU 硬件自动完成以下转换步骤:

  1. CPU 发出虚拟地址:指令中的寄存器值即为虚拟地址(VA)。
  2. TLB 查找:MMU 首先在转换后备缓冲器(TLB)中查找是否有该 VA 对应的页表项缓存。
  3. 页表遍历(TLB Miss 时):若 TLB 未命中,MMU 硬件自动遍历多级页表,逐级读取页表项。
  4. 权限与属性检查:检查页表项中的访问权限(AP)、可执行(XN)、域(Domain)等位域。
  5. 生成物理地址:将虚拟页号(VPN)替换为物理页帧号(PFN),页内偏移保持不变。
  6. 填充 TLB:将新转换的页表项写入 TLB,加速后续访问。
⚠️ 常见误区: 页表遍历由 MMU 硬件完成,不是由操作系统软件完成。操作系统只负责构建和更新页表,MMU 自动读取页表进行转换。软件干预仅发生在缺页异常(Page Fault)时。
MMU 地址转换完整流程 ① CPU 发出 VA 虚拟地址 ② TLB 查找 是否命中? 命中? ⑤ 生成 PA 物理地址 ③ 页表遍历 多级页表查找 ④ 权限检查 AP/XN/Domain ⑥ 填充 TLB 回填 TLB

1.4 页表项与地址拆分

以 ARMv8-A 64 位系统为例,典型 4KB 页、4 级页表(L0~L3)的地址拆分如下:

地址分量 位宽 说明
L0 索引 9 位 选择 L0 页表项,指向 L1 页表基址
L1 索引 9 位 选择 L1 页表项,指向 L2 页表基址
L2 索引 9 位 选择 L2 页表项,指向 L3 页表基址
L3 索引 9 位 选择 L3 页表项,包含物理页帧号
页内偏移 12 位 4KB 页内字节偏移(0x000 ~ 0xFFF)
// 虚拟地址拆分示例(48 位 VA,4KB 页)
// VA[47:39] = L0 索引
// VA[38:30] = L1 索引
// VA[29:21] = L2 索引
// VA[20:12] = L3 索引
// VA[11:0]  = 页内偏移

// 物理地址 = 页帧号(来自 L3 页表项) + 页内偏移
// 例如:L3 页表项输出 PFN = 0x7A000,偏移 = 0x3F0
// PA = (0x7A000 << 12) | 0x3F0 = 0x7A0003F0
关键设计权衡:
  • 页大小:4KB 页粒度细、内存利用率高,但页表层级多;2MB/1GB 大页减少页表层级,适合大内存连续映射。
  • 页表级数:ARMv8-A 支持 3~4 级页表,级数越多页表本身占内存越小,但转换延迟增加。
  • TLB 覆盖:TLB 容量有限,大页可显著提升 TLB 覆盖范围,减少 TLB Miss。

1.5 ARM 硬件 MMU 兼容性要点

ARM 架构的 MMU 实现与 x86 有显著差异,在系统软件适配时需重点关注:

特性 ARMv8-A x86-64
页表基址寄存器 TTBR0_EL1(用户态)、TTBR1_EL1(内核态) CR3
页表格式 描述符格式,包含类型、属性、下一级基址 PML4/PDPT/PD/PT 四级表项
转换粒度 4KB、16KB、64KB 可选 4KB 为主,支持 2MB/1GB 大页
地址空间标识 ASID(Address Space ID)支持进程隔离 PCID(Process Context ID)
内存属性编码 MAIR(Memory Attribute Indirection Register) PAT(Page Attribute Table)
ARM 特有机制: ARMv8-A 的页表项包含 nG(非全局)位,配合 ASID 实现 TLB 进程隔离;AF(访问标志)位用于跟踪页是否被访问过,支持页面置换算法。
ARMv8-A 页表项关键位域(L3 页表项示例) 63:48 保留 / 47:12 物理页帧号(PFN) / 11:10 AP / 9:8 SH / 7:6 AttrIdx / 5:4 NS+XN / 3:1 类型 / 0 Valid AP[2:0]:访问权限(EL0/EL1 读写执行) AttrIdx[2:0]:指向 MAIR 寄存器中的内存属性索引(Cacheable/Device/NC) SH[1:0]:共享属性(Non-shareable/Inner/Outer)