1. 内存管理概述:Linux 内存管理子系统的作用、物理内存与虚拟内存概念、MMU 硬件基础

1.1 Linux 内存管理子系统的作用与地位

Linux 内存管理子系统是内核中最核心、最复杂的模块之一。它负责在有限的物理内存资源下,为系统中所有进程(包括内核自身)提供高效、安全、隔离的内存访问环境。其核心职责可归纳为以下五个方面:

职责领域 具体功能 关键机制
地址空间管理 为每个进程创建独立的虚拟地址空间,隔离进程间内存访问 页表、TLB、MMU
物理内存分配与回收 管理物理页框的分配、释放、回收与交换 伙伴系统、slab 分配器、页面回收
内存映射 支持文件映射、匿名映射、共享内存、设备 I/O 映射 vma、mmap、缺页异常
内存保护与共享 控制进程间内存共享与访问权限 页表权限位、COW、mprotect
性能优化 利用缓存、预取、大页、NUMA 亲和性提升效率 TLB 刷新策略、HugeTLB、页面着色
关键认知: 内存管理子系统是操作系统性能与安全性的基石。一个设计不良的内存分配器会导致碎片化、性能抖动甚至系统崩溃;而虚拟内存机制则是现代多任务操作系统实现进程隔离与保护的前提。

1.2 物理内存与虚拟内存概念

1.2.1 物理内存 (Physical Memory)

物理内存是计算机硬件中实际存在的 RAM(随机存取存储器),由一系列连续的物理地址(Physical Address, PA)组成。内核通过 页框 (page frame) 来管理物理内存,每个页框通常为 4KB(或 2MB/1GB 大页)。物理内存是有限的资源,所有进程和内核代码最终都必须映射到物理页框上才能执行。

1.2.2 虚拟内存 (Virtual Memory)

虚拟内存是操作系统为每个进程提供的抽象地址空间。每个进程拥有独立的虚拟地址空间(例如 32 位系统为 4GB,64 位系统可达 128TB 或更大)。进程使用的地址是虚拟地址(Virtual Address, VA),由 MMU 硬件配合页表动态转换为物理地址。虚拟内存带来的核心优势包括:

  • 隔离性: 进程无法直接访问其他进程的物理内存,除非通过共享内存机制。
  • 简化编程: 程序员无需关心物理内存的布局与碎片,只需使用连续的虚拟地址。
  • 按需分配: 进程可以申请比物理内存更大的虚拟空间,实际物理页框在访问时才分配(缺页异常)。
  • 共享与保护: 通过页表权限位实现代码段只读、数据段可读写等保护策略。
类比理解: 物理内存好比酒店的房间(有限资源),虚拟内存好比每个客人手中的房卡(地址空间)。客人通过房卡上的房间号(虚拟地址)找到房间,前台(MMU)负责将房卡号映射到实际房间号(物理地址)。不同客人的房卡号可以相同,但映射到不同房间,互不干扰。

1.2.3 物理地址 vs 虚拟地址对比

特性 物理地址 (PA) 虚拟地址 (VA)
空间大小 受硬件 RAM 容量限制 受 CPU 位宽限制(如 48 位)
唯一性 全局唯一 每个进程独立
管理粒度 页框(4KB/2MB/1GB) 页(4KB/2MB/1GB)
访问方式 直接通过总线访问 需 MMU 转换
保护机制 无硬件保护 页表权限位提供保护

1.3 MMU 硬件基础

内存管理单元(Memory Management Unit, MMU)是 CPU 内部负责虚拟地址到物理地址转换的硬件模块。它是虚拟内存机制得以实现的物理基础。MMU 的核心工作流程如下:

  1. 地址输入: CPU 执行指令时,发出虚拟地址(VA)。
  2. 页表遍历: MMU 根据 VA 中的页号(VPN)查找当前进程的页表(Page Table),页表存储在物理内存中。
  3. TLB 加速: 为了加速查找,MMU 首先检查 TLB(Translation Lookaside Buffer,页表缓存)。如果命中,直接获得物理页框号(PFN)。
  4. 权限检查: MMU 检查页表项中的权限位(读/写/执行、用户/内核),若权限不足则触发缺页异常或保护错误。
  5. 地址合成: 将物理页框号(PFN)与 VA 中的页内偏移(offset)拼接,得到最终的物理地址(PA)。
  6. 内存访问: 物理地址被发送到内存控制器,完成数据读写。
性能关键点: TLB 的命中率直接影响内存访问延迟。一次 TLB 未命中(miss)需要多次内存访问来遍历页表,开销极大。Linux 内核通过大页(HugeTLB)、透明大页(THP)以及 TLB 刷新策略来优化这一环节。

1.4 虚拟地址到物理地址转换流程(SVG 架构图)

下图展示了从 CPU 发出虚拟地址到最终访问物理内存的完整硬件与内核协作流程:

虚拟地址到物理地址转换流程 虚拟地址 → 物理地址转换流程(MMU 硬件协作) CPU 发出 VA TLB 查找 页表遍历 权限检查 地址合成 PA 物理内存访问 缺页异常处理 TLB miss 页表项无效 分配物理页 TLB hit (快速路径) 说明:TLB hit 可跳过页表遍历与权限检查,直接合成物理地址,是性能关键路径。缺页异常由内核处理,分配物理页框并更新页表。

1.5 页表与多级页表结构

页表是存储在物理内存中的数据结构,用于记录虚拟页号(VPN)到物理页框号(PFN)的映射关系。为了节省内存,现代 64 位架构(如 x86_64、ARM64)普遍采用 多级页表 结构。以 x86_64 的 4 级页表为例:

  • PGD (Page Global Directory): 顶级页表,每个进程一个,占用一个物理页框。
  • P4D (Page 4th Directory): 四级页表(部分架构使用)。
  • PUD (Page Upper Directory): 三级页表。
  • PMD (Page Middle Directory): 二级页表。
  • PTE (Page Table Entry): 一级页表,直接指向物理页框。

多级页表的优势在于:对于大范围未使用的虚拟地址空间,中间级页表可以留空(不分配物理页框),从而大幅节省内存。例如,一个进程只使用少量内存,其 PGD 和部分 PUD/PMD 存在,而大量 PMD/PTE 页表页根本不需要分配。

内核视角: Linux 内核通过 struct mm_struct 管理进程的页表基址(PGD 物理地址)。上下文切换时,内核将新进程的 PGD 地址写入 CPU 的 CR3 寄存器(x86)或 TTBR(ARM),MMU 随即使用新页表进行地址转换。

1.6 本章小结

本章建立了 Linux 内存管理的核心概念框架:

  • 内存管理子系统 是内核的基石,负责地址空间管理、物理内存分配、映射与保护。
  • 物理内存 是硬件资源,虚拟内存 是操作系统提供的抽象,二者通过 MMU 和页表实现映射。
  • MMU 是硬件转换引擎,TLB 是其缓存,缺页异常是内核介入的时机。
  • 多级页表 在 64 位系统中节省了大量内存,是虚拟内存规模化的关键设计。