当前位置: 首页 > news >正文

[VMM]虚拟地址到物理地址的三级或四级页表查找过程详解

虚拟地址到物理地址的三级或四级页表查找过程详解

       摘要:下面以 x86-64 的 4 级页表为例,详述虚拟地址到物理地址的三级或四级页表查找(page‐walk)过程,PDE/PTE 的相互关系及各字段含义,并说明页表级数与支持的页大小之间的对应。


1. 4 级页表结构概览

       x86-64 采用 4 级页表,每级页表都是一个 4 KiB 大小的页,包含 512(2^9)个 8 B(64 bit)条目。4 级分别是:

  1. PML4(Page-Map Level-4)
  2. PDPT (Page-Directory Pointer Table)
  3. PD (Page-Directory)
  4. PT (Page-Table)

CR3 寄存器保存 PML4 的物理页帧号(PFN)。硬件依据 CR3 启动页表查找。


2. 虚拟地址格式

x86-64 典型使用 48 bit 虚拟地址(canonical),格式划分为:

63…48 (16 sign‐extension)47…3938…3029…2120…1211…0
需与 bit 47 同号扩展PML4PDPTPDPTOffset
  • 每个“索引”字段宽度 9 bit → 2^9=512 条目
  • 最低 12 bit 为页内偏移(offset) → 4 KiB 页

总计 9×4+12=48 bit。


3. 4 级页表查找过程

假设要访问虚拟地址 VA:

  1. 取 PML4E
    physical_address = CR3[51:12]∥(VA[47:39]×8)
    读 8 B → 得到 PML4E(页目录指针表基址)。

  2. 取 PDPTE
    if (!PML4E.Present) → ⃰ 触发 page‐fault
    base = (PML4E.PFN)<<12
    physical_address = base + VA[38:30]×8 → 读 PDPTE

  3. 取 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

  4. 取 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

  5. 最终页表项 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 布局)

位号名称作用
0P (Present)“在内存中”标志;0→page‐fault
1RW0=只读,1=可写
2US0=只针对特权级,1=用户态可访问
3PWT写透(Write‐Through)
4PCD缓存禁用(Cache‐Disable)
5A (Accessed)CPU 每次读/写此页时置位
6D (Dirty)仅 PTE:写此页时置位
7PS / PATPDE: PS=1→2 MiB(级 3)或 1 GiB(级 2)大页;PTE: PAT→页属性表索引
8G (Global)仅 PTE:全局页,不随 CR3 切换 TLB
9–11AVLOS 保留可用
12–51PFNPage Frame Number; 物理页基址 >>12
52–62保留/保留给软件
63NX (No-Exec)CPU 禁止执行此页
  • PRWUS 等标志决定访问权限和缓存策略。
  • 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 KiB1249512
2 MiB2139512
1 GiB3029512

注意: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,可灵活管理权限、缓存策略及访问跟踪。
http://www.xdnf.cn/news/745957.html

相关文章:

  • 4000万日订单背后,饿了么再掀即时零售的“效率革命”
  • win1011安装WinGet和Windows Terminal
  • CQF预备知识:一、微积分 -- 1.8 多变量函数:多元微积分详解
  • 离线安装 Python 包及其全部依赖
  • 谷歌Stitch:AI赋能UI设计,免费高效新利器
  • Vue2+Vuex通过数组动态生成store数据(分组模式)
  • 类FNAF游戏后续
  • Constraints and Triggers
  • 零基础一站式端游内存辅助编写教程(无密)
  • 进程间通信(信号量)
  • .net Avalonia 在centos部署
  • LeetCode 高频 SQL 50 题(基础版)之 【聚合函数】部分
  • 5.31 数学复习笔记 22
  • 【计算机网络】子网划分
  • linux nm/objdump/readelf/addr2line命令详解
  • 使用Yolov8 训练交通标志数据集:TT100K数据集划分
  • ICML 2025 Spotlight | 机器人界的「Sora」!让机器人实时进行未来预测和动作执行!
  • Day 41
  • 墨香阁小说阅读前端项目
  • t017-高校实习管理系统 【含材料源码!!!】
  • 【Netty系列】解决TCP粘包和拆包:LengthFieldBasedFrameDecoder
  • 最小二乘准则例题
  • [ElasticSearch] ElasticSearch的初识与基本操作
  • Python实现P-PSO优化算法优化Catboost分类模型项目实战
  • CppCon 2014 学习:ODB, Advanced Weapons and Tactics
  • 浏览器隐私:原理与检测方法
  • 2025年渗透测试面试题总结-匿名[校招]渗透测试工程师(题目+回答)
  • C++ 17 正则表达式
  • Java并发编程实战 Day 1:Java并发编程基础与线程模型
  • MySQL锁机制