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 硬件配合页表动态转换为物理地址。虚拟内存带来的核心优势包括:
- 隔离性: 进程无法直接访问其他进程的物理内存,除非通过共享内存机制。
- 简化编程: 程序员无需关心物理内存的布局与碎片,只需使用连续的虚拟地址。
- 按需分配: 进程可以申请比物理内存更大的虚拟空间,实际物理页框在访问时才分配(缺页异常)。
- 共享与保护: 通过页表权限位实现代码段只读、数据段可读写等保护策略。
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 的核心工作流程如下:
- 地址输入: CPU 执行指令时,发出虚拟地址(VA)。
- 页表遍历: MMU 根据 VA 中的页号(VPN)查找当前进程的页表(Page Table),页表存储在物理内存中。
- TLB 加速: 为了加速查找,MMU 首先检查 TLB(Translation Lookaside Buffer,页表缓存)。如果命中,直接获得物理页框号(PFN)。
- 权限检查: MMU 检查页表项中的权限位(读/写/执行、用户/内核),若权限不足则触发缺页异常或保护错误。
- 地址合成: 将物理页框号(PFN)与 VA 中的页内偏移(offset)拼接,得到最终的物理地址(PA)。
- 内存访问: 物理地址被发送到内存控制器,完成数据读写。
1.4 虚拟地址到物理地址转换流程(SVG 架构图)
下图展示了从 CPU 发出虚拟地址到最终访问物理内存的完整硬件与内核协作流程:
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 页表页根本不需要分配。
struct mm_struct 管理进程的页表基址(PGD 物理地址)。上下文切换时,内核将新进程的 PGD 地址写入 CPU 的 CR3 寄存器(x86)或 TTBR(ARM),MMU 随即使用新页表进行地址转换。
1.6 本章小结
本章建立了 Linux 内存管理的核心概念框架:
- 内存管理子系统 是内核的基石,负责地址空间管理、物理内存分配、映射与保护。
- 物理内存 是硬件资源,虚拟内存 是操作系统提供的抽象,二者通过 MMU 和页表实现映射。
- MMU 是硬件转换引擎,TLB 是其缓存,缺页异常是内核介入的时机。
- 多级页表 在 64 位系统中节省了大量内存,是虚拟内存规模化的关键设计。