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),通过层级索引缩小页表占用。
2.1.1 4级页表地址转换流程
下图展示了x86-64架构下,虚拟地址经过4级页表查找,最终得到物理地址的完整路径。
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 |
hugepagesz=1GB 内核参数。并非所有平台都默认启用。
2.2.1 大页如何减少页表层级
使用2MB大页时,PT表被跳过,PD表中的条目直接指向2MB的物理页帧。使用1GB大页时,PD表也被跳过,PDPT表中的条目直接指向1GB的物理页帧。层级减少意味着地址转换所需的访存次数从4次降低到3次或2次。
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路组相联 |
2.3.2 大页对TLB命中率的影响
使用2MB大页时,单个TLB条目覆盖的内存范围是4KB页的512倍。这意味着,对于同样大小的内存工作集,所需的TLB条目数大幅减少,TLB命中率显著提升。
2.4 页表层级与TLB的协同工作
当CPU访问一个虚拟地址时,首先在TLB中查找。如果TLB命中,直接获得物理地址;如果TLB缺失,硬件页表遍历器(Page Walker)自动执行多级页表查找,并将结果填入TLB。大页通过减少页表层级,不仅降低了页表遍历的开销,还提高了TLB的利用效率。
rte_eal_init() 自动映射大页内存。建议在BIOS中启用1GB大页支持,并在内核命令行配置 default_hugepagesz=1G hugepagesz=1G hugepages=8,以获得最大的TLB覆盖范围。
2.4.1 地址转换完整流程(TLB Miss + Page Walk)
- CPU发出虚拟地址,MMU并行查询TLB。
- TLB Miss:未找到映射,触发Page Walk。
- 硬件遍历页表:从CR3寄存器读取PML4基址,依次查找PML4、PDPT、PD、PT(4KB页)或跳过部分层级(大页)。
- 获取物理页帧号(PFN),组合偏移得到物理地址。
- 填充TLB:将新的映射存入TLB,供后续访问使用。
- 执行内存访问:使用物理地址访问L1/L2/L3缓存或主存。
2.5 本章小结
- 标准4KB页导致页表庞大、TLB覆盖范围极小,不适合DPDK等大内存应用。
- 2MB/1GB大页通过减少页表层级(3级或2级),大幅降低页表占用和TLB缺失率。
- TLB结构分为L1 ITLB、L1 DTLB和L2 STLB,大页能显著提升TLB覆盖范围(从256KB提升至128MB甚至64GB)。
- 联合调优核心:在DPDK中配置大页内存,结合NUMA亲和性,最大化TLB命中率,减少内存访问延迟。