[VMM]虚拟地址到物理地址的三级或四级页表查找过程详解
虚拟地址到物理地址的三级或四级页表查找过程详解
摘要:下面以 x86-64 的 4 级页表为例,详述虚拟地址到物理地址的三级或四级页表查找(page‐walk)过程,PDE/PTE 的相互关系及各字段含义,并说明页表级数与支持的页大小之间的对应。
1. 4 级页表结构概览
x86-64 采用 4 级页表,每级页表都是一个 4 KiB 大小的页,包含 512(2^9)个 8 B(64 bit)条目。4 级分别是:
- PML4(Page-Map Level-4)
- PDPT (Page-Directory Pointer Table)
- PD (Page-Directory)
- PT (Page-Table)
CR3 寄存器保存 PML4 的物理页帧号(PFN)。硬件依据 CR3 启动页表查找。
2. 虚拟地址格式
x86-64 典型使用 48 bit 虚拟地址(canonical),格式划分为:
63…48 (16 sign‐extension) | 47…39 | 38…30 | 29…21 | 20…12 | 11…0 |
---|---|---|---|---|---|
需与 bit 47 同号扩展 | PML4 | PDPT | PD | PT | Offset |
- 每个“索引”字段宽度 9 bit → 2^9=512 条目
- 最低 12 bit 为页内偏移(offset) → 4 KiB 页
总计 9×4+12=48 bit。
3. 4 级页表查找过程
假设要访问虚拟地址 VA:
-
取 PML4E
physical_address = CR3[51:12]∥(VA[47:39]×8)
读 8 B → 得到 PML4E(页目录指针表基址)。 -
取 PDPTE
if (!PML4E.Present) → ⃰ 触发 page‐fault
base = (PML4E.PFN)<<12
physical_address = base + VA[38:30]×8 → 读 PDPTE -
取 PDE
if (!PDPTE.Present) → ⃰ page‐fault
如果 PDPTE.PS==1 → 1 GiB 大页,直接构成物理地址:
PA = (PDPTE.PFN)[51:30]∥VA[29:0]
→ 结束
否则
base = (PDPTE.PFN)<<12
physical_address = base + VA[29:21]×8 → 读 PDE -
取 PTE
if (!PDE.Present) → ⃰ page‐fault
如果 PDE.PS==1 → 2 MiB 大页,物理地址:
PA = (PDE.PFN)[51:21]∥VA[20:0]
→ 结束
否则
base = (PDE.PFN)<<12
physical_address = base + VA[20:12]×8 → 读 PTE -
最终页表项 PTE
if (!PTE.Present) → ⃰ page‐fault
PA = (PTE.PFN)<<12 ∥ VA[11:0]
4. PDE(Page-Directory Entry)与 PTE(Page-Table Entry)的关系
- PDPT 中的条目通常称为 PDPTE,也可视作“第 2 级 PDE”。
- PD 中的条目称作 PDE(第 3 级)。
- PT 中的条目称作 PTE(第 4 级)。
共性:所有级别的条目前 12 bit 都是控制/状态位,第 12 bit 及以上为物理页帧号(PFN)或保留字段。
差异:只有第 2/3 级 PDE(PDPTE/PDE)含 PS(Page Size)字段,表示“大页”映射。
5. PDE/PTE 各字段含义(64 bit 布局)
位号 | 名称 | 作用 |
---|---|---|
0 | P (Present) | “在内存中”标志;0→page‐fault |
1 | RW | 0=只读,1=可写 |
2 | US | 0=只针对特权级,1=用户态可访问 |
3 | PWT | 写透(Write‐Through) |
4 | PCD | 缓存禁用(Cache‐Disable) |
5 | A (Accessed) | CPU 每次读/写此页时置位 |
6 | D (Dirty) | 仅 PTE:写此页时置位 |
7 | PS / PAT | PDE: PS=1→2 MiB(级 3)或 1 GiB(级 2)大页;PTE: PAT→页属性表索引 |
8 | G (Global) | 仅 PTE:全局页,不随 CR3 切换 TLB |
9–11 | AVL | OS 保留可用 |
12–51 | PFN | Page Frame Number; 物理页基址 >>12 |
52–62 | 保留/保留给软件 | |
63 | NX (No-Exec) | CPU 禁止执行此页 |
- P、RW、US 等标志决定访问权限和缓存策略。
- PS(Page Size)仅存在于第 2/3 级 PDE:
- PDPT 条目(级 2)中 PS=1 表示 1 GiB 大页;
- PD 条目(级 3)中 PS=1 表示 2 MiB 大页。
- PAT(PTE 级 4)可配合 PCD/PWT 实现更细颗粒的缓存属性。
- A/ D 用于硬件的页面置换算法(TLB 回写)。
- G 标志“全局”页在切换地址空间(更新 CR3)时不失效。
- NX 为 64 bit 扩展,控制页面可执行性。
6. 页表级数 vs. 支持的页大小
- 对于 4 KiB 标准页,需要完整 4 级查表:offset = 12 bit。
- 若只用 2 MiB 大页(PS=1 在级 3),可“跳过”最底层 PT,使用 3 级。
- 若只用 1 GiB 大页(PS=1 在级 2),可“跳过” PD+PT 两级,使用 2 级。
页面大小 | offset bits | 所需级数 | 每级索引宽度 | 每表条目数 |
---|---|---|---|---|
4 KiB | 12 | 4 | 9 | 512 |
2 MiB | 21 | 3 | 9 | 512 |
1 GiB | 30 | 2 | 9 | 512 |
注意:PML4(级 1)不能用于映射大页,它始终指向下一级 PDPT。
7. 硬件加速:TLB 与 Page‐Walk Cache
完整 4 级查表最坏要 4 次内存访问。现代 CPU 加速措施:
- 一级/二级/三级 TLB 缓存最近访问的映射;
- 部分架构还有 Page‐Walk Cache,缓存中间级页表内容;
- 同时支持大页可大幅降低查表次级。
小结
- x86-64 的 4 级页表使用 CR3→PML4→PDPT→PD→PT→PA 的逐级映射,PDE 和 PTE 在结构上类似,唯独中间级 PDE 带 PS 位用于大页。
- 页表级数与页大小直接对应:4 KiB 用 4 级,2 MiB 可降到 3 级,1 GiB 降到 2 级。
- 每个 PDE/PTE 包含多达 12 bit 的控制/状态位,以及 40 bit 以上的 PFN,可灵活管理权限、缓存策略及访问跟踪。