
TTW的定义
TTW 是 Table Walk 的缩写,中文常翻译为"页表遍历"或"查表"。 它是指内存管理单元 在翻译后备缓冲器 未命中时,根据当前进程的页表结构,一步步地查询物理内存中的页表,最终将虚拟地址转换为物理地址的过程。
要理解 T4TW,需要先了解几个背景知识:
- MMU:内存管理单元,是 CPU 的一个硬件部件,负责将软件使用的虚拟地址转换为物理内存使用的物理地址。这是实现虚拟内存、内存保护和多任务隔离的基石。
- 页表:一个存储在物理内存中的数据结构,就像是 MMU 用来查的"地址翻译字典"。它定义了虚拟页到物理页帧的映射关系。现代系统通常使用多级页表(如 x86-64 的四级页表),像一个多层的索引目录。
- TLB:翻译后备缓冲器,是 MMU 内部的一个小型高速缓存。它缓存了最近使用过的"虚拟页号 -> 物理页帧号"的映射关系。当 CPU 需要转换地址时,MMU 首先在 TLB 中查找,如果找到(TLB 命中),转换在一个时钟周期内即可完成,速度极快。
TTW 发生的时机:
当 CPU 需要访问一个内存地址(比如加载指令或数据)时,MMU 首先用该地址的虚拟页号去查找 TLB。如果 TLB 中没有对应的有效表项(即TLB Miss),这时就需要启动 TTW 过程。
TTW 的过程:
TTW 就是 MMU"翻阅"内存中完整页表的过程。以经典的 x86-64 四级页表为例:
- MMU 从 CR3 寄存器(现在叫 IA32_PML4)中获取当前进程的顶级页表(PML4)的物理基地址。
- 用虚拟地址的第 1 段索引位,在 PML4 表中找到一项,获取下一级页表(页目录指针表)的物理基地址。
- 用虚拟地址的第 2 段索引位,在 PDPT 中找到一项,获取下一级页表(页目录)的物理基地址。
- 用虚拟地址的第 3 段索引位,在页目录中找到一项,获取最后一级页表(页表)的物理基地址。
- 用虚拟地址的第 4 段索引位,在页表中找到最终的表项,这个表项中就包含了目标物理页帧号。
- 将物理页帧号与虚拟地址中的页内偏移组合,得到完整的物理地址。
- (关键步骤) 将这次查找到的映射关系(虚拟页号 -> 物理页帧号)写入 TLB 中,以便后续快速访问。
这个过程可能需要 4 次物理内存访问(每一级页表访问一次内存)。由于内存访问速度远慢于 CPU 和 TLB,所以一次 TTW 的代价非常高(通常是数百个 CPU 周期)。
为什么 TTW 如此重要?
- 性能关键路径:TTW 是处理 TLB 未命中的核心操作。如果程序访问的内存模式空间局部性很差(频繁访问大量不连续的地址),会导致大量的 TLB Miss 和随之而来的 TTW,性能会急剧下降。这种现象称为 TLB 颠簸。
- 硬件与软件的实现:
· 硬件 TTW:现代 CPU 的 MMU 内置了硬件表遍历单元。当发生 TLB Miss 时,由这个硬件电路自动完成上述多级页表的查找过程,操作系统无需干预。这是最常见的方式。
· 软件 TTW:在一些较旧的架构(如 MIPS)或某些优化场景下,发生 TLB Miss 时,CPU 会触发一个异常(TLB Fault),并跳转到操作系统内核预设的异常处理程序。由操作系统的代码来执行页表遍历,找到映射后,手动写回 TLB。这给了操作系统更大的灵活性,但速度比硬件 TTW 慢。 - 与缺页异常的区别:TTW 查找的是页表本身。如果 TTW 过程中发现某一级页表项是空的(Present 位为 0),或者权限检查失败,MMU 会触发一个 缺页异常 或访问权限异常。此时,操作系统的缺页异常处理程序会被调用,负责分配物理页、建立映射、从磁盘加载数据等更复杂的工作。可以说,TTW 是"找地图",而缺页处理是"绘制新地图"。
简单比喻:
· TLB 就像是你记在脑子里的常用电话号码(快速,但容量小)。
· 页表 就像是一本厚厚的电话簿(完整,但在书架上,找起来慢)。
· TTW 就是当你想拨一个号码但脑子里没记住时,去书架上翻开电话簿查找的过程。查完后,你很可能会把这个新号码背下来(填入 TLB),下次再打就快了。