2. 内存分页机制基础:标准4KB页、大页(2MB/1GB)概念、页表层级与TLB结构

内存分页是操作系统将虚拟地址转换为物理地址的核心机制。分页粒度直接决定了页表大小、TLB覆盖范围以及内存访问效率。在DPDK这类高性能数据平面应用中,理解并利用大页(HugePages)是降低TLB缺失、提升报文转发性能的关键前提。

2.1 标准4KB页与分页层级

传统操作系统(如Linux x86-64)默认使用4KB大小的页面。对于现代服务器动辄几十GB甚至TB级别的内存,若仅使用单级页表,页表本身将占用巨大内存。因此,x86-64架构引入了多级页表(4级页表:PML4 → PDPT → PD → PT),通过层级索引缩小页表占用。

核心问题: 4KB页导致页表项(PTE)数量庞大。例如,管理 1GB 内存需要 262,144 个PTE,TLB仅能覆盖极小的连续地址范围(通常仅数MB),导致频繁的TLB Miss。
关键指标: TLB覆盖范围 = TLB条目数 × 页面大小。4KB页下,若TLB有64个条目,仅覆盖 64 × 4KB = 256KB 内存。对于DPDK转发面(通常需要GB级内存映射),TLB缺失率极高。

2.1.1 4级页表地址转换流程

下图展示了x86-64架构下,虚拟地址经过4级页表查找,最终得到物理地址的完整路径。

4级页表地址转换流程 x86-64 4级页表地址转换流程 虚拟地址 (48位) PML4 (9位) PDPT (9位) PD (9位) PT (9位) 偏移 (12位) PML4表 PDPT表 PD表 PT表 物理地址 = 物理页基址 + 偏移 4KB页:12位偏移

2.2 大页(HugePages)概念:2MB与1GB

大页是操作系统支持的非标准页面大小,旨在减少页表层级、降低TLB压力。x86-64架构支持两种大页尺寸:2MB(通过PD表直接映射)和1GB(通过PDPT表直接映射)。

页面大小 页表层级 管理1GB内存所需PTE数 TLB覆盖范围(64条目) 适用场景
4KB 4级(PML4→PDPT→PD→PT) 262,144 256 KB 通用桌面/服务器
2MB 3级(PML4→PDPT→PD) 512 128 MB DPDK、数据库、虚拟化
1GB 2级(PML4→PDPT) 1 64 GB 高性能计算、大内存DPDK
注意: 1GB大页需要CPU和BIOS支持(如“1G page”特性),且操作系统需配置 hugepagesz=1GB 内核参数。并非所有平台都默认启用。

2.2.1 大页如何减少页表层级

使用2MB大页时,PT表被跳过,PD表中的条目直接指向2MB的物理页帧。使用1GB大页时,PD表也被跳过,PDPT表中的条目直接指向1GB的物理页帧。层级减少意味着地址转换所需的访存次数从4次降低到3次或2次。

大页减少页表层级对比 大页减少页表层级对比 4KB页:4级页表 PML4 PDPT PD PT 物理页 2MB大页:3级页表 PML4 PDPT PD 2MB物理页 跳过PT 1GB大页:2级页表 PML4 PDPT 1GB物理页 跳过PD和PT

2.3 TLB结构与命中率

TLB(Translation Lookaside Buffer)是CPU内部的高速缓存,用于缓存最近使用的虚拟地址到物理地址的映射。TLB通常分为指令TLB(ITLB)和数据TLB(DTLB),现代CPU还包含二级统一TLB(L2 TLB)。

2.3.1 TLB层级与容量

TLB层级 典型容量(Intel Skylake) 页面大小支持 关联方式
L1 ITLB 64 条目 4KB / 2MB / 1GB 全相联
L1 DTLB 64 条目 4KB / 2MB 全相联
L2 STLB(统一) 1536 条目 4KB / 2MB 8路组相联
TLB命中率公式: TLB命中率 = TLB命中次数 / (TLB命中次数 + TLB缺失次数)。TLB缺失会导致CPU暂停(stall),等待页表遍历(Page Walk),通常耗时数十到数百个CPU周期。

2.3.2 大页对TLB命中率的影响

使用2MB大页时,单个TLB条目覆盖的内存范围是4KB页的512倍。这意味着,对于同样大小的内存工作集,所需的TLB条目数大幅减少,TLB命中率显著提升。

大页对TLB覆盖范围的影响 大页对TLB覆盖范围的影响 4KB页:TLB覆盖 256KB ... ... (64个条目) 仅覆盖 256KB 内存 2MB大页:TLB覆盖 128MB ... ... (64个条目) 覆盖 128MB 内存(512倍提升) TLB覆盖范围对比 4KB页:64×4KB=256KB 2MB页:64×2MB=128MB 1GB页:64×1GB=64GB TLB缺失率降低 99%+

2.4 页表层级与TLB的协同工作

当CPU访问一个虚拟地址时,首先在TLB中查找。如果TLB命中,直接获得物理地址;如果TLB缺失,硬件页表遍历器(Page Walker)自动执行多级页表查找,并将结果填入TLB。大页通过减少页表层级,不仅降低了页表遍历的开销,还提高了TLB的利用效率。

DPDK最佳实践: 在DPDK初始化时,通过 rte_eal_init() 自动映射大页内存。建议在BIOS中启用1GB大页支持,并在内核命令行配置 default_hugepagesz=1G hugepagesz=1G hugepages=8,以获得最大的TLB覆盖范围。

2.4.1 地址转换完整流程(TLB Miss + Page Walk)

  1. CPU发出虚拟地址,MMU并行查询TLB。
  2. TLB Miss:未找到映射,触发Page Walk。
  3. 硬件遍历页表:从CR3寄存器读取PML4基址,依次查找PML4、PDPT、PD、PT(4KB页)或跳过部分层级(大页)。
  4. 获取物理页帧号(PFN),组合偏移得到物理地址。
  5. 填充TLB:将新的映射存入TLB,供后续访问使用。
  6. 执行内存访问:使用物理地址访问L1/L2/L3缓存或主存。
TLB Miss与Page Walk流程 TLB Miss与Page Walk流程 CPU发出虚拟地址 查询TLB TLB Hit → 物理地址 TLB Miss → Page Walk 遍历多级页表 填充TLB + 返回物理地址 Page Walk开销 4KB页:4次内存访问 2MB页:3次内存访问 1GB页:2次内存访问 大页减少Page Walk延迟

2.5 本章小结

  • 标准4KB页导致页表庞大、TLB覆盖范围极小,不适合DPDK等大内存应用。
  • 2MB/1GB大页通过减少页表层级(3级或2级),大幅降低页表占用和TLB缺失率。
  • TLB结构分为L1 ITLB、L1 DTLB和L2 STLB,大页能显著提升TLB覆盖范围(从256KB提升至128MB甚至64GB)。
  • 联合调优核心:在DPDK中配置大页内存,结合NUMA亲和性,最大化TLB命中率,减少内存访问延迟。