1. 课程导论与内存管理全景
内存管理是 Linux 内核最核心、最复杂的子系统之一。它直接决定了系统的性能、稳定性与安全性。从用户态进程的 malloc 到物理页框的分配,中间跨越了虚拟地址空间、页表、TLB、缺页异常、伙伴系统与 slab 分配器等多个层次。本章将为你绘制一张完整的内存管理全景图,并规划出清晰的学习路径。
1.1 为什么内存管理如此重要?
内存管理是操作系统性能的“咽喉”。以下是几个关键维度:
- 进程隔离与安全:每个进程拥有独立的虚拟地址空间(
mm_struct),通过页表映射防止非法访问。 - 物理内存高效利用:通过伙伴系统管理连续物理页框,slab 分配器管理内核对象,减少碎片。
- 大地址空间支持:在 64 位系统上,虚拟地址空间可达 2^48 或 2^57 字节,远超物理内存。
- 性能加速:TLB 缓存近期使用的页表项,MMU 硬件加速地址转换,缺页异常按需加载。
1.2 内存管理整体架构
Linux 内存管理从硬件到软件分为四个主要层次,它们协同工作,构成完整的地址转换与分配链路。
1.3 核心组件详解
下面逐一介绍架构图中的关键组件,理解它们各自的职责与协作方式。
1.3.1 MMU(内存管理单元)
MMU 是 CPU 内部的硬件单元,负责将虚拟地址(VA)转换为物理地址(PA)。它遍历页表,检查权限,并在 TLB 未命中时触发硬件页表遍历。
1.3.2 TLB(转译后备缓冲器)
TLB 是 MMU 内部的高速缓存,存储最近使用的页表项。TLB 命中可避免昂贵的页表遍历。上下文切换时,TLB 需要刷新或使用 ASID(地址空间标识符)来隔离进程。
1.3.3 页表(Page Table)
页表是虚拟地址到物理地址的映射数据结构。Linux 在 x86-64 上使用 4 级页表(PGD → P4D → PUD → PMD → PTE),ARM64 支持 3/4/5 级可配置。页表项还包含权限位、脏位、访问位等。
1.3.4 伙伴系统(Buddy System)
伙伴系统是物理页框分配的核心算法。它将空闲页框按 2 的幂次分组(order 0 到 order 10),分配时从对应 order 的链表取块,释放时合并伙伴块以减少碎片。
1.3.5 slab 分配器
slab 分配器用于管理内核对象(如 task_struct、inode)的分配与释放。它基于伙伴系统提供的连续页框,通过对象缓存、着色(coloring)和每 CPU 缓存(kmem_cache_cpu)大幅提高分配效率。
1.4 组件对比表
| 组件 | 层次 | 管理对象 | 核心算法/结构 | 关键性能指标 |
|---|---|---|---|---|
| MMU | 硬件 | 地址转换 | 页表遍历、TLB 缓存 | 转换延迟(ns) |
| TLB | 硬件 | 页表项缓存 | 全相联/组相联、LRU 替换 | 命中率(>99%) |
| 页表 | 内核+硬件 | VA→PA 映射 | 多级页表、huge page | 遍历深度(4/5 级) |
| 伙伴系统 | 内核 | 物理页框 | 2 的幂次链表、合并/分裂 | 碎片率、分配延迟 |
| slab 分配器 | 内核 | 内核对象 | 对象缓存、着色、每 CPU 缓存 | 分配/释放吞吐量 |
1.5 地址转换完整流程
下面这张 SVG 流程图展示了从用户态 malloc 到物理页框的完整路径,帮助你建立全局视角。
1.6 课程学习路径
本课程共 30 章,分为 6 个阶段,从基础概念到高级实战,层层递进。
| 阶段 | 章节范围 | 核心内容 | 实战产出 |
|---|---|---|---|
| 基础篇 | 第 1-5 章 | mm_struct、VMA、页表结构、TLB 原理 | 手写迷你页表遍历工具 |
| 分配器篇 | 第 6-10 章 | 伙伴系统、slab 分配器、per-CPU 页框缓存 | 模拟 buddy 分配器 |
| 缺页与回收篇 | 第 11-15 章 | 缺页异常处理、页面回收算法、LRU 链表 | 缺页异常 hook 模块 |
| 高级特性篇 | 第 16-20 章 | 透明大页、内存规整、KSM、内存热插拔 | 大页性能对比测试 |
| 调试与优化篇 | 第 21-25 章 | /proc/meminfo、ftrace、perf、内存泄漏检测 | 内存泄漏定位实战 |
| 架构实战篇 | 第 26-30 章 | ARM64 与 x86-64 对比、容器内存隔离、cgroup memory | 完整内存子系统分析报告 |
1.7 本章小结
本章我们建立了 Linux 内存管理的全景视图:从用户态 mm_struct 到硬件 MMU/TLB,中间经过页表、伙伴系统和 slab 分配器。这张全景图将作为后续 29 章的地图,每深入一个组件,你都能清楚它在大图中的位置与作用。