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)完成这一映射。页表是操作系统维护的数据结构,记录了虚拟页号到物理页框号的对应关系以及访问权限。
地址转换的基本流程:
- CPU 发出虚拟地址(VA)。
- MMU 将 VA 拆分为虚拟页号(VPN)和页内偏移(Offset)。
- MMU 以 VPN 为索引查询页表,获取对应的物理页框号(PFN)。
- 将 PFN 与 Offset 拼接,形成物理地址(PA)。
- 若页表项无效(缺页),MMU 触发缺页异常,由内核处理。
性能要点:每次地址转换都访问内存中的页表会严重降低性能。因此 MMU 内部集成了 TLB(Translation Lookaside Buffer,转换后备缓冲器),缓存最近使用的页表项,实现纳秒级地址转换。
1.3 页框与页帧:物理内存的组织单元
物理内存被划分为固定大小的块,称为页框(Page Frame),也称为物理页。在 Linux 内核中,每个页框由 struct page 结构体描述。页框的大小通常为 4KB(也可配置为 2MB/1GB 大页)。虚拟内存中的“页”最终必须映射到某个页框才能被 CPU 访问。
关键概念区分:
- 页(Page):虚拟地址空间中的最小单位,大小与页框一致。
- 页框(Page Frame):物理内存中的最小分配单位,是页的物理载体。
- 页表项(PTE):页表中的条目,记录虚拟页到页框的映射关系及标志位。
常见误区:不要混淆“页框”与“页帧”。在 Linux 内核源码中,“页帧”常指
struct page 实例,而“页框”指物理内存区域。两者在实际讨论中经常混用,但本质都是物理内存的 4KB 块。
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 压力,是内存回收调优的重要选项。