2. 硬件基础:x86-64 与 ARM64 架构下的多级页表硬件原理,TLB 与页表缓存机制

现代 64 位处理器(x86-64 与 ARM64)均采用多级页表结构来管理虚拟地址到物理地址的转换。多级页表的核心优势在于:它允许为每个进程建立稀疏的虚拟地址空间,仅分配实际使用的页表层级,从而大幅节省内存。本章深入剖析两种主流架构的硬件页表遍历机制、TLB 结构与缓存一致性策略。

2.1 多级页表硬件遍历原理

CPU 在访问内存时,MMU(内存管理单元)会依据当前进程的页表基址寄存器(x86-64 的 CR3,ARM64 的 TTBR0_EL1/TTBR1_EL1)开始逐级查找。每一级页表条目(PTE)指向下一级页表的物理基址,直到最后一级 PTE 包含目标物理页帧号(PFN)和权限位。

架构 页表级数(4KB 页) 虚拟地址位数 页表基址寄存器 每级页表条目大小
x86-64 4 级(PML4 → PDPT → PD → PT) 48 位 CR3 8 字节
ARM64 4 级(PGD → PUD → PMD → PTE) 48 位(52 位可选) TTBR0_EL1 / TTBR1_EL1 8 字节
关键差异:x86-64 的页表遍历完全由硬件 MMU 自动完成,页表格式固定;ARM64 则允许通过 TCR(Translation Control Register)配置页粒度(4KB/16KB/64KB)和虚拟地址宽度,硬件遍历逻辑随配置变化。
性能要点:多级页表遍历在 TLB 未命中时最多需要 4 次内存访问(每级一次)。x86-64 和 ARM64 均通过页表缓存(Page Walk Cache)来加速中间级页表的查找,减少实际内存读取次数。
x86-64 4 级页表硬件遍历流程(4KB 页) 虚拟地址(48 位) PML4 (9 bit) PDPT (9 bit) PD (9 bit) PT (9 bit) 偏移 (12 bit) PML4 表 CR3 基址 + 索引 PDPT 表 PML4E 指向 PD 表 PDPTE 指向 PT 表 PDE 指向 物理页帧(4KB)

2.2 TLB 结构与缓存机制

TLB(Translation Lookaside Buffer)是 CPU 内部的高速缓存,用于存储最近使用的虚拟地址到物理地址的映射。TLB 命中可避免多级页表遍历,是内存访问性能的关键。

2.2.1 TLB 层级与类型

架构 L1 TLB(指令/数据) L2 TLB(统一) 条目数(典型) 页大小支持
x86-64 分离(ITLB / DTLB) 统一 STLB L1: 64~64 条 / L2: 512~2048 条 4KB / 2MB / 1GB
ARM64 分离(ITLB / DTLB) 统一 L2 TLB L1: 32~48 条 / L2: 512~1024 条 4KB / 16KB / 64KB / 2MB / 1GB
TLB 抖动风险:当进程频繁切换或访问大量不同虚拟地址时,TLB 条目被不断替换,导致 TLB 未命中率上升。对于数据库、HPC 等大内存工作负载,大页(Huge Pages)是缓解 TLB 压力的核心手段——一个 2MB 大页条目可覆盖 512 个 4KB 小页的映射。

2.2.2 TLB 一致性维护

当内核修改页表(如解除映射、更改权限、迁移页面)后,必须使失效的 TLB 条目无效,否则 CPU 可能使用过时的缓存映射。不同架构提供了不同的 TLB 失效指令:

  • x86-64:INVLPG 指令使单个虚拟地址对应的 TLB 条目失效;MOV CR3 或 INVPCID 用于全局或进程级刷新。
  • ARM64:TLBI 指令族(如 TLBI VAE1IS)支持按地址、按 ASID、按 VMID 进行选择性失效;DSB + ISB 保证指令顺序。
性能调优建议:批量页表更新时,尽量使用惰性 TLB 失效(如 x86-64 的 lazy TLB 模式)或批量失效指令(ARM64 的 TLBI ASID 广播),避免逐条 INVLPG 带来的开销。

2.3 页表缓存(Page Walk Cache)与硬件预取

现代 CPU 不仅缓存最终的页表条目(TLB),还缓存中间级页表的查找结果,称为页表缓存(Page Walk Cache, PWC)或页表结构缓存(Page Structure Cache)。

TLB 与页表缓存协同工作流程 CPU 核心 L1 TLB ITLB / DTLB L2 TLB(统一) 页表缓存(PWC) 缓存中间级 PTE 内存页表 4 级遍历 硬件页表遍历路径 L1 TLB 未命中 → L2 TLB 未命中 → PWC 命中(跳过中间级内存访问)→ 内存页表遍历

2.3.1 硬件页表预取

x86-64 和 ARM64 均支持硬件页表预取(Hardware Page Table Walker Prefetch)。当发生 TLB 未命中并触发页表遍历时,硬件会预取相邻虚拟地址的页表条目到 TLB 或 PWC 中,利用空间局部性减少后续未命中。ARM64 的 FEAT_HPDS(Hierarchical Page Table Walk)进一步允许将页表本身放在非缓存区域,避免页表遍历污染 L1/L2 缓存。

2.4 架构对比与调优要点

特性 x86-64 ARM64 调优影响
页表级数 固定 4 级(4KB 页) 可配置 3~5 级(取决于页大小和 VA 宽度) ARM64 可通过大页减少级数,降低遍历深度
TLB 失效粒度 INVLPG(单地址)/ MOV CR3(全刷新) TLBI VAE1(按地址+ASID)/ TLBI ALLE1(全刷新) ARM64 的 ASID 机制支持进程级 TLB 隔离,减少上下文切换开销
大页支持 2MB(PDE 直接映射)/ 1GB(PDPTE 直接映射) 2MB(PMD 块条目)/ 1GB(PUD 块条目) 两者均支持透明大页(THP),但 ARM64 需要内核显式启用块映射
页表缓存 PWC 集成在 L2 TLB 中 独立 PWC 或与 L2 TLB 共享 ARM64 的独立 PWC 在频繁页表遍历场景下更高效
硬件预取 相邻页表预取(Next-page prefetcher) 可配置的页表预取(通过 TCR 控制) 数据库/大内存应用建议开启硬件预取
核心结论:无论是 x86-64 还是 ARM64,多级页表与 TLB 的设计目标都是减少内存访问延迟。性能调优的关键在于:
1. 利用大页减少 TLB 压力与页表级数。
2. 合理管理 TLB 失效范围,避免全局刷新。
3. 理解硬件页表缓存与预取行为,避免页表遍历成为瓶颈。