1. 内存管理全景:物理内存、虚拟内存、MMU 与页表基础概念

内存管理是操作系统内核最核心的子系统之一。它负责在有限的物理内存(DRAM)之上,为每个进程提供一个独立、连续、安全的虚拟地址空间。本章从最基础的硬件与内核视角,拆解物理内存、虚拟内存、MMU 和页表这四大支柱,为后续的缺页异常、KSM 合并等高级主题奠定坚实的理论基础。

1.1 物理内存:硬件资源与内核视角

物理内存是计算机中实际的 RAM 芯片,以字节为单位编址。内核通过 页帧(Page Frame) 来管理物理内存,每个页帧通常为 4KB(或 2MB/1GB 大页)。

概念 说明
物理地址(PA) 硬件总线上的真实地址,由 CPU 内存控制器直接访问。
页帧(Page Frame) 物理内存的最小分配单元,Linux 内核用 struct page 描述每个页帧。
ZONE_DMA / ZONE_NORMAL / ZONE_HIGHMEM 内核将物理内存划分为不同区域,以适配不同硬件的 DMA 限制和地址映射需求。
伙伴系统(Buddy System) 内核用于分配连续物理页帧的算法,以 2 的幂次阶数管理空闲块。
性能要点: 物理内存的分配与回收是内核最频繁的操作之一。伙伴系统的碎片化程度直接影响大页分配成功率,进而影响数据库、HPC 等内存密集型应用的性能。

1.2 虚拟内存:进程的独立地址空间

每个用户态进程拥有独立的虚拟地址空间(32 位下 4GB,64 位下 128TB 或更大)。虚拟内存解决了物理内存的三大痛点:碎片化、进程隔离、超量使用(overcommit)。

  • 地址转换透明性: 进程无需感知物理内存的位置,所有地址访问都经过 MMU 转换。
  • 按需分配(Demand Paging): 进程申请内存时只分配虚拟地址,物理页帧在真正访问时才分配。
  • 共享内存: 多个进程的虚拟页可以映射到同一个物理页帧(如共享库、KSM 合并页)。
  • 交换(Swap): 物理内存不足时,内核将不活跃的页换出到磁盘,腾出物理页帧。
关键指标: 虚拟内存的 VSS(虚拟集大小)通常远大于 RSS(常驻集大小)。性能调优时,应关注 RSS 和 PSS(比例集大小),而非 VSS。

1.3 MMU:地址转换的硬件引擎

内存管理单元(MMU)是 CPU 内部负责将虚拟地址(VA)转换为物理地址(PA)的硬件模块。转换过程依赖页表,并利用 TLB(Translation Lookaside Buffer) 加速。

MMU 地址转换流程 虚拟地址 (VA) MMU 页表遍历 + TLB 查找 物理地址 (PA) TLB 缓存 (快表) 页表 (内存中) 说明: TLB 命中时,MMU 直接获得物理地址,无需访问内存中的页表(约 0.5-1 周期)。 TLB 未命中时,MMU 需遍历多级页表(约 10-100 周期),性能开销显著增加。
调优陷阱: TLB 未命中是内存延迟的隐形杀手。对于大内存工作集(如 Redis、数据库),使用 2MB 或 1GB 大页可以减少页表项数量,提升 TLB 覆盖范围,显著降低平均内存访问延迟。

1.4 页表:多级映射与权限控制

页表是存储在内存中的数据结构,用于将虚拟页号(VPN)映射到物理页帧号(PFN)。现代 64 位架构使用 4 级或 5 级页表(PGD → P4D → PUD → PMD → PTE),以节省页表本身占用的物理内存。

页表层级 名称 作用
PGD Page Global Directory 顶级目录,每个进程一个,指向下一级。
P4D Page 4th Directory 4 级页表新增层级(x86_64 5-level paging)。
PUD Page Upper Directory 上层目录,进一步细分地址空间。
PMD Page Middle Directory 中间目录,可映射 2MB 大页。
PTE Page Table Entry 页表项,包含物理页帧号、权限位、脏位、访问位等。
x86_64 4 级页表结构 虚拟地址 (48 位) PGD 索引 PUD 索引 PMD 索引 PTE 索引 页内偏移 (12 位) PGD PUD PMD PTE 物理页 关键点: • 每级页表占用一个 4KB 物理页帧,仅当该级有有效映射时才分配。 • PMD 级可映射 2MB 大页(HugeTLB),PTE 级映射 4KB 小页。 • 页表项中的 NX(不可执行)、RW(读写)、U/S(用户/超级用户)位实现硬件级安全隔离。

1.5 全景关系图:四大组件协同

物理内存、虚拟内存、MMU 和页表并非孤立存在,它们通过地址转换流水线紧密协作。下图展示了从进程访问虚拟地址到最终读写物理内存的完整链路。

内存管理全景:四大组件协同 进程 A 虚拟地址空间 MMU 地址转换 + 权限检查 物理内存 页帧 / DRAM 页表 多级映射 + 权限位 TLB 缓存 最近使用的 VA→PA 映射 性能调优启示: • 页表层级越深,TLB 未命中代价越大 → 使用大页减少页表项。 • 页表本身占用物理内存 → 对于大量进程,页表开销不可忽视(KSM 可合并页表?不,KSM 合并的是匿名页内容)。

1.6 本章小结与性能调优视角

  • 物理内存是底层硬件资源,内核通过伙伴系统和页帧管理其分配与回收。
  • 虚拟内存为进程提供隔离、连续的地址空间,支持按需分配和超量使用。
  • MMU 是硬件转换引擎,TLB 命中率是内存延迟的关键。
  • 页表是多级映射数据结构,其深度和条目数量直接影响 TLB 未命中代价和内存占用。