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

[VMM]现代 CPU 中用于加速多级页表查找的Page‐Table Entry原理

 现代 CPU 中用于加速多级页表查找的Page‐Table Entry原理

       摘要:以下从背景、结构、查找流程、一致性与性能影响等方面,详细介绍现代 CPU 中用于加速多级页表查找的 Page-Walk Cache(也称 Walker Cache 或 Page‐Table Entry Cache)。


1. 背景:为何需要 Page‐Walk Cache

  • 多级页表查找成本高
    以 x86-64 为例,4 级页表走完一次要依次访问 PML4、PDPT、PD、PT,每级都要一次内存读(若不命中 L1/L2/L3 缓存),最糟糕可能要 4 次 LLC Miss → DRAM 访问,延迟数百纳秒。

  • TLB 只能缓存最终映射
    TLB(Translation Lookaside Buffer)存的是虚拟页→物理页的最终映射,一旦 TLB miss,仍需重新走页表。Page-Walk Cache 介于 TLB 与内存之间,缓存中间级页表项,减少每次 page-walk 的内存访问数。


2. Page-Walk Cache 的总体结构

  1. 独立或共享
    • 有的 CPU 为每级页表各设一个小缓存(L0 for PML4E, L1 for PDPTE, L2 for PDE, L3 for PTE),也有合并成一个统一 Walker Cache。
  2. Entry 内容
    • Tag:〈CR3 或 ASID/PCID, 虚拟页号中对应级别的索引位〉
    • Data:对应级别的页表项完整 64 bit(含 PFN + control bits)。
  3. 容量与关联度
    • 极小,一般几十到几百条;全相联或 4-way/8-way set-assoc;足够缓冲热点上下文,但远小于 TLB。

3. 查找与填充流程

  1. TLB Miss → 触发 Walker
    硬件页表行走器(Page‐Walker)启动,将 CR3(携带 ASID/PCID)与 VA 分解成 4 个 9-bit 索引字段。

  2. 各级查 Page-Walk Cache
    对第一级(PML4)索引:

    • 在 PML4‐Cache 中查 Tag;
    • Hit → 直接拿到对应 PML4E;
    • Miss → 按常规:从内存(LLC)读取 PML4E 后填 Cache。
      再对第二级(PDPT)、第三级(PD)、第四级(PT)重复相同动作。
  3. 汇聚获得最终 PTE

    • 若中途某级 PDE.Mark-PS=1,且映射大页,则后续级别跳过;Walker Cache 同样可命中大页级别的 PDE entry。
    • 最终得出 PTE,更新 TLB,并返回物理页基址。

4. 一致性与失效

  • 软件修改页表
    操作系统写入或无效化页表后,需执行 invlpgCR3 重载,隐含触发 Walker Cache 对应条目失效。CPU 内部会:

    • 按 ASID/PCID 精确清除相关 Tag,或
    • 在全局 CR3 切换时一并失效。
  • Page-Walk Cache 可与 PCID 协同
    支持 Process-Context ID (PCID) 时,Tag 包含 PCID,切换地址空间无需全表失效,只失效对应新 CR3/PCID 下不可见的条目。


5. 嵌套/二级页表(EPT/NPT)支持

在虚拟化场景中,需同时走 二级页表(Guest)和 一级页表(Host/EPT)。现代 CPU 会:

  • 分阶段 Walker:先走 Guest 页表(用 Guest CR3),再走 Host EPT(用 EPTP),两套 Walker Cache 可复用;
  • 双重 Tag:Tag 中加上两级 CR3/EPTP 标识,保证隔离。

6. 性能效果

  • 减少内存访问次数
    典型热点工作集下,Walker Cache 命中率可达 80–90%,平均每次 Page‐Walk 只需 1–2 次 LLC 访问,而非最差的 4 次。
  • 降低延迟与功耗
    减少 DRAM 访问,Page-Walk 延迟可从数百纳秒降到几十纳秒;同时降低系统总功耗。
  • 提升 TLB miss 下的 IPC
    对于大量随机地址访问(如数据库、VMware),Page-Walk Cache 极大提升穿页性能。

7. 硬件设计考量

  • 容量 vs 并发
    • 容量太小命中率低,太大又占硅片面积。常见设计:每级 32–128 条;4 级共 128–256 条。
  • 关联度
    • 全相联提高命中,硬件实现复杂;4-way set-assoc 更折中。
  • 替换策略
    • LRU 或近似 LRU;与 TLB 类似。
  • 与缓存系统协同
    • Walker Cache miss 后读内存,优先走 L1/L2/L3 Cache,若最终 LLC Miss 再到 DRAM。

小结

       Page-Walk Cache 是现代 CPU 在 TLB miss 时,为缓存页表中间级别条目的专用小型高速缓存。它通过给每级页表查找加速,减少 Page-Walk 对内存的压力,显著降低 TLB miss 的延迟和功耗,对操作系统的页表结构透明、自动协同 PCID 与虚拟化二级页表,从而大幅提升系统的整体性能。


Page-Walk Cache的替换策略具体是如何实现的?

       摘要:在硬件上,Page-Walk Cache(PWC)通常是一个小容量、多路组相联的缓存;其替换策略需要在极度受限的时序和面积下,既能提供较高命中率,又要保证硬件实现简单。主流做法是用 伪 LRU(Pseudo-LRU),具体流程如下。


1. 组织形式

假设 PWC 是一个 S-way 组相联缓存,共有 N 组(set),每组 S 条 entry,每条 entry 存储一个页表项和若干 tag 比特。

– S 常见取值:2, 4, 8。
– N 也不大,可能几十到上百。

每组都要维护一组替换状态位,用来选择下一次 miss 时的 victim way。


2. 伪-LRU (Tree-based PLRU)

最经典也最常见的是 树形 PLRU

  1. 结构
    – 对 S=4:使用 3 个二叉树节点位 b0,b1,b2。
    • b0 根节点,控制左子树(ways 0–1) vs 右子树(ways 2–3)
    • b1 左子树内部,控制 way 0 vs way 1
    • b2 右子树内部,控制 way 2 vs way 3

  2. 选替换行(Victim Selection)
    – 从根开始:若 b0==0 → 走左子树,否则走右;
    – 在子树内部再按 b1/b2 决定更“冷”的那条路。

  3. 命中更新(MRU 更新)
    – 若访问到 way k:
    • 根节点 b0 = (k ∈ {0,1}) ? 1 : 0
    • 如果 k ∈ 左子树,则 b1 = (k==0?1:0);如果 ∈ 右子树,则 b2 = (k==2?1:0)。

  4. Miss 时:
    – 用上面算法找出“最老”way 作替换;
    – 用新的 tag + data 覆盖它;
    – 把对应的 b0/b1/b2 更新成 MRU,与命中时相同。

这种做法只需要 S–1 位状态、硬件逻辑简单,能近似逼近 LRU。


3. 其他简化/优化策略

  1. 2-way:
    – 只需 1 位 MRU bit,0/1 表示上次命中的是 way0 还是 way1,miss 时替换另一路。

  2. 8-way:
    – 可用 7 位树型 PLRU(3 层)
    – 或分成两级:先选出 “四路组” 再内部二分。

  3. 真 LRU(只对 very small S=2,4)
    – 用 2-bit 或 4-entry 阶梯式计数器记录使用顺序。
    – 面积和延迟稍大,一般只在关键路径足够宽松时采用。

  4. “Insertion Policy” 调整
    – MISS 时不总插入 MRU,可以插入到某中间位置 (e.g., “MRU-1”),以防热不热点数据迅速污染缓存。
    – “Bypass” 流水线/预取产生的低重用数据,不分配到 PWC,保留空间给真正的页表热点。


4. 一致性与失效

  • CR3/ASID 切换:PWC 的每条 entry tag 中带有地址空间 ID;CR3 切换会使得所有“前地址空间” entry 视为 miss,无需显式清空。
  • 软件写页表:OS 在修改页表后执行 invlpg,微架构会检测到对应 Virtual‐Page tag 并失效相关 PWC entry(通过比对 CR3+VPN)。

5. 性能权衡

  • 容量 vs 命中率:PWC 容量通常几百条即可将 Page-Walk 的内存访问次数从最坏 4 次下探至平均 1–2 次。
  • 替换开销:树型 PLRU 的状态更新仅几路 MUX+D-FF,远低于“真 LRU”的多位加法/比较器。
  • 侵入延迟:PWC 查找与更新与深度流水线并行,通常不影响 TLB-Miss 触发的页表行走器 (PTW) 的主时序。

小结

Page-Walk Cache 几乎通用地采用 树型 Pseudo-LRU 替换策略:

  • 每组用 S−1 个位记录最近访问方向;
  • 命中时更新这些位以标记 MRU 路径;
  • Miss 时用它们快速定位“最冷”那一路进行替换。

       这种策略硬件开销小、速度快,可在极短周期内完成替换决策,并且配合 ASID/PCID 等 tag 机制实现高效一致性管理。

相关文章:

  • Qt SQL模块基础
  • 元胞自动机(Cellular Automata, CA)
  • CQF预备知识:一、微积分 -- 1.8.3 二元泰勒展开详解
  • 【Rust 轻松构建轻量级多端桌面应用】
  • 利用aqs构建一个自己的非公平独占锁
  • 【LUT技术专题】图像自适应3DLUT
  • 设计模式——原型设计模式(创建型)
  • Cypress + React + TypeScript
  • macOS 上安装运行 PowerShell
  • 电路图识图基础知识-常用仪表识图及接线(九)
  • uniapp uni-id Error: Invalid password secret
  • Oracle用户账号过期终极解决方案
  • 嵌入式学习笔记 - STM32 HAL库以及标准库内核以及外设头文件区别问题
  • python 空气质量可视化,数据分析 + 前后端分离 + ppt 演讲大纲
  • 【数据分析】基于Cox模型的R语言实现生存分析与生物标志物风险评估
  • 告别硬编码!用工厂模式优雅构建可扩展的 Spring Boot 应用 [特殊字符]
  • AI炼丹日志-25 - OpenAI 开源的编码助手 Codex 上手指南
  • 修改 vscode 左侧导航栏的文字大小 (更新版)
  • C++文件和流基础
  • uniapp 键盘顶起页面问题
  • 成都网站建设小公司排名/口碑营销的主要手段有哪些
  • 北京市社会建设工作委员会网站/百度指数官网移动版
  • 那些网站是php开发的/怎么关键词优化网站
  • 做qq链接的网站/沈阳网站关键词优化多少钱
  • 免费的个人网站/个人网页制作成品欣赏
  • 外贸饰品网站/微信推广软件哪个好