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 字节 |
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 |
2.2.2 TLB 一致性维护
当内核修改页表(如解除映射、更改权限、迁移页面)后,必须使失效的 TLB 条目无效,否则 CPU 可能使用过时的缓存映射。不同架构提供了不同的 TLB 失效指令:
- x86-64:
INVLPG指令使单个虚拟地址对应的 TLB 条目失效;MOV CR3或INVPCID用于全局或进程级刷新。 - ARM64:
TLBI指令族(如TLBI VAE1IS)支持按地址、按 ASID、按 VMID 进行选择性失效;DSB+ISB保证指令顺序。
INVLPG 带来的开销。
2.3 页表缓存(Page Walk Cache)与硬件预取
现代 CPU 不仅缓存最终的页表条目(TLB),还缓存中间级页表的查找结果,称为页表缓存(Page Walk Cache, PWC)或页表结构缓存(Page Structure Cache)。
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 控制) | 数据库/大内存应用建议开启硬件预取 |
1. 利用大页减少 TLB 压力与页表级数。
2. 合理管理 TLB 失效范围,避免全局刷新。
3. 理解硬件页表缓存与预取行为,避免页表遍历成为瓶颈。