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

在深入 Linux 内核内存回收与 kswapd 守护进程之前,必须牢固掌握内存管理的底层基石。本章从物理内存与虚拟内存的抽象模型出发,逐步拆解 MMU(内存管理单元)的地址转换机制、页表结构以及页框/页帧的物理组织方式。这些概念是理解页面回收、换入换出和 NUMA 平衡的前提。

1.1 物理内存与虚拟内存

物理内存是系统中实际存在的 RAM 芯片,容量有限且被所有进程共享。虚拟内存则为每个进程提供独立的、连续的地址空间(通常为 4GB 或更大),使进程误以为自己独占整个内存。操作系统通过虚拟内存机制实现进程隔离、简化内存分配,并支持比物理内存更大的逻辑空间。

特性 物理内存 虚拟内存
本质 硬件 RAM 芯片 操作系统抽象出的逻辑地址空间
容量 受硬件限制(如 8GB、64GB) 受 CPU 地址总线宽度限制(32 位为 4GB,64 位极大)
可见性 所有进程共享 每个进程独享,互不干扰
连续性 物理上可能不连续(碎片化) 逻辑上连续,底层可映射到不连续的物理页
管理粒度 页框(Page Frame) 页(Page)
关键理解:虚拟内存不是“磁盘上的交换空间”,而是 CPU 和操作系统共同维护的地址映射体系。交换空间只是虚拟内存的物理后备存储之一。

1.2 MMU 与页表:地址转换的核心

MMU(Memory Management Unit)是 CPU 内部负责将虚拟地址转换为物理地址的硬件模块。它通过查询页表(Page Table)完成这一映射。页表是操作系统维护的数据结构,记录了虚拟页号到物理页框号的对应关系以及访问权限。

地址转换的基本流程:

  1. CPU 发出虚拟地址(VA)。
  2. MMU 将 VA 拆分为虚拟页号(VPN)和页内偏移(Offset)。
  3. MMU 以 VPN 为索引查询页表,获取对应的物理页框号(PFN)。
  4. 将 PFN 与 Offset 拼接,形成物理地址(PA)。
  5. 若页表项无效(缺页),MMU 触发缺页异常,由内核处理。
性能要点:每次地址转换都访问内存中的页表会严重降低性能。因此 MMU 内部集成了 TLB(Translation Lookaside Buffer,转换后备缓冲器),缓存最近使用的页表项,实现纳秒级地址转换。
MMU 地址转换流程 MMU 地址转换流程 虚拟地址 (VA) VPN | Offset 页表查询 物理地址 (PA) TLB 缓存 缺页异常处理 TLB 命中时直接返回 PA,无需访问页表

1.3 页框与页帧:物理内存的组织单元

物理内存被划分为固定大小的块,称为页框(Page Frame),也称为物理页。在 Linux 内核中,每个页框由 struct page 结构体描述。页框的大小通常为 4KB(也可配置为 2MB/1GB 大页)。虚拟内存中的“页”最终必须映射到某个页框才能被 CPU 访问。

关键概念区分:

  • 页(Page):虚拟地址空间中的最小单位,大小与页框一致。
  • 页框(Page Frame):物理内存中的最小分配单位,是页的物理载体。
  • 页表项(PTE):页表中的条目,记录虚拟页到页框的映射关系及标志位。
常见误区:不要混淆“页框”与“页帧”。在 Linux 内核源码中,“页帧”常指 struct page 实例,而“页框”指物理内存区域。两者在实际讨论中经常混用,但本质都是物理内存的 4KB 块。
虚拟页到页框映射 虚拟页 → 页框映射 虚拟页 VP 0 虚拟页 VP 1 虚拟页 VP 2 虚拟页 VP 3 PTE: PFN 3 PTE: PFN 7 PTE: 无效 PTE: PFN 1 页框 PFN 1 页框 PFN 3 页框 PFN 7 页框 PFN 9 缺页 (未映射) 页表项无效时触发缺页异常,内核分配页框并建立映射

1.4 多级页表与 64 位架构

在 64 位架构(如 x86_64)中,虚拟地址空间巨大(48 位有效地址),若使用单级页表会占用过多内存。Linux 采用多级页表(4 级或 5 级)来压缩页表体积:

  • PGD(Page Global Directory)—— 顶级目录
  • P4D(Page 4th Directory)—— 第 4 级(5 级页表时存在)
  • PUD(Page Upper Directory)—— 上级目录
  • PMD(Page Middle Directory)—— 中间目录
  • PTE(Page Table Entry)—— 页表项

多级页表的核心优势:只有实际使用的虚拟地址范围才需要分配页表层级,未使用的区域不占用物理内存。

调优关联:kswapd 在回收页面时,需要遍历进程的页表来查找可回收的页面。多级页表结构决定了遍历效率,也影响 kswapd 的 CPU 开销。大页(Huge Pages)可以减少页表层级,降低 TLB 压力,是内存回收调优的重要选项。

1.5 本章小结