1. TLB 基础概念:定义、作用与内存访问路径中的位置
1.1 什么是 TLB?
TLB(Translation Lookaside Buffer,页表缓存) 是 CPU 内部的一个专用高速缓存,用于存储最近使用的虚拟地址到物理地址的映射关系。它是分页内存管理系统的关键硬件组件,直接决定了虚拟地址翻译的性能。
核心定义:TLB 是页表(Page Table)的硬件缓存,保存最近使用的页表项(PTE),避免每次内存访问都遍历多级页表。
1.2 TLB 的作用
- 加速地址翻译:将虚拟地址(VA)到物理地址(PA)的翻译时间从多次内存访问(多级页表遍历)降低到 1 个时钟周期左右。
- 降低内存访问延迟:避免每次访存都访问主存中的页表,减少约 2–4 次内存读取。
- 支持虚拟内存:使分页机制的性能开销可接受,是虚拟内存系统能够实际部署的前提。
- 减少页表遍历的功耗:TLB 命中时无需访问片外内存,显著降低能耗。
1.3 TLB 在内存访问路径中的位置
在典型的现代处理器中,TLB 位于 CPU 核心与缓存层次之间,是地址翻译流水线的第一站。下图展示了 TLB 在内存访问路径中的精确位置:
1.4 TLB 与页表的关系
| 对比维度 | 页表(Page Table) | TLB(Translation Lookaside Buffer) |
|---|---|---|
| 存储位置 | 主存(DRAM) | CPU 芯片内部(SRAM) |
| 访问速度 | 数十纳秒(多次访存) | 1 个时钟周期(亚纳秒级) |
| 容量 | 与虚拟地址空间成正比(MB ~ GB) | 通常 32 ~ 2048 个条目 |
| 管理方式 | 操作系统软件维护 | 硬件自动管理 + 软件 flush 控制 |
| 作用范围 | 整个进程的完整映射 | 最近访问的热点映射子集 |
1.5 TLB 的层次结构
现代处理器通常采用多级 TLB 设计,以平衡访问速度与命中率:
- L1 TLB:紧贴 CPU 核心,容量最小(通常 32–64 条目),访问延迟 1 个周期,分为指令 TLB(ITLB)和数据 TLB(DTLB)。
- L2 TLB:统一指令/数据,容量较大(512–2048 条目),延迟 2–5 个周期,作为 L1 TLB 未命中时的第二级缓存。
- 大页 TLB:专门缓存 2MB/1GB 大页的映射,减少大页场景下的 TLB 压力。
性能关键指标:TLB 命中率通常要求在 99% 以上。若 TLB 命中率低于 95%,系统性能将因频繁的页表遍历而严重下降。大页(Huge Pages)技术正是通过减少页表项数量来提升 TLB 覆盖范围。
1.6 TLB 的典型访问流程
- CPU 发出虚拟地址(VA),包含虚拟页号(VPN)和页内偏移(Offset)。
- TLB 并行查找:将 VPN 与 TLB 中所有条目的标签(Tag)进行比较。
- TLB 命中:直接返回对应的物理页号(PPN),与偏移拼接形成物理地址(PA),送往缓存/内存。
- TLB 未命中:硬件触发页表遍历(Page Walk),从多级页表中读取页表项。
- 页表项回填:将新获取的页表项写入 TLB,替换旧条目(通常使用 LRU 或随机替换策略)。
- 重试访问:重新执行步骤 2,此时 TLB 命中,完成地址翻译。
1.7 TLB 条目结构
每个 TLB 条目通常包含以下字段:
| 字段 | 说明 | 典型位数 |
|---|---|---|
| VPN | 虚拟页号(标签) | 20–36 位 |
| PPN | 物理页号(数据) | 20–36 位 |
| ASID | 地址空间标识符(进程隔离) | 8–16 位 |
| 权限位 | 读/写/执行/用户/内核 | 4–8 位 |
| 属性位 | 全局位(Global)、脏位(Dirty)、有效位(Valid) | 3–5 位 |