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) 加速。
调优陷阱: 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 | 页表项,包含物理页帧号、权限位、脏位、访问位等。 |
1.5 全景关系图:四大组件协同
物理内存、虚拟内存、MMU 和页表并非孤立存在,它们通过地址转换流水线紧密协作。下图展示了从进程访问虚拟地址到最终读写物理内存的完整链路。
1.6 本章小结与性能调优视角
- 物理内存是底层硬件资源,内核通过伙伴系统和页帧管理其分配与回收。
- 虚拟内存为进程提供隔离、连续的地址空间,支持按需分配和超量使用。
- MMU 是硬件转换引擎,TLB 命中率是内存延迟的关键。
- 页表是多级映射数据结构,其深度和条目数量直接影响 TLB 未命中代价和内存占用。