1. 课程导论与内存管理全景

内存管理是 Linux 内核最核心、最复杂的子系统之一。它直接决定了系统的性能、稳定性与安全性。从用户态进程的 malloc 到物理页框的分配,中间跨越了虚拟地址空间、页表、TLB、缺页异常、伙伴系统与 slab 分配器等多个层次。本章将为你绘制一张完整的内存管理全景图,并规划出清晰的学习路径。

学习目标:理解 Linux 内存管理的分层架构,掌握 MMU、TLB、页表、伙伴系统、slab 分配器的角色与协作关系,为后续章节的深入实战打下坚实基础。

1.1 为什么内存管理如此重要?

内存管理是操作系统性能的“咽喉”。以下是几个关键维度:

  • 进程隔离与安全:每个进程拥有独立的虚拟地址空间(mm_struct),通过页表映射防止非法访问。
  • 物理内存高效利用:通过伙伴系统管理连续物理页框,slab 分配器管理内核对象,减少碎片。
  • 大地址空间支持:在 64 位系统上,虚拟地址空间可达 2^48 或 2^57 字节,远超物理内存。
  • 性能加速:TLB 缓存近期使用的页表项,MMU 硬件加速地址转换,缺页异常按需加载。
关键指标:一次 TLB 命中仅需约 0.5-1 纳秒,而一次缺页异常(磁盘 I/O)可能需要数毫秒——相差百万倍。内存管理优化的核心就是“减少缺页、提高 TLB 命中率”。

1.2 内存管理整体架构

Linux 内存管理从硬件到软件分为四个主要层次,它们协同工作,构成完整的地址转换与分配链路。

Linux 内存管理四层架构 Linux 内存管理四层架构 用户态进程 (User Process) mm_struct · 虚拟地址空间 · malloc/free · brk/mmap 内核核心层 (Kernel Core) VMA · 缺页异常处理 · 内存映射 · 页面回收 内存分配器 (Allocators) 伙伴系统 (Buddy) · slab 分配器 · 页框管理 硬件层 (Hardware) MMU · TLB · 页表 (Page Table) · 物理内存

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)大幅提高分配效率。

常见误区:伙伴系统管理的是“页框”(4KB 连续物理块),而 slab 管理的是“内核对象”(大小从几十字节到几 KB)。slab 从伙伴系统“批发”页框,然后“零售”给内核其他模块。两者是上下层关系,而非竞争关系。

1.4 组件对比表

组件 层次 管理对象 核心算法/结构 关键性能指标
MMU 硬件 地址转换 页表遍历、TLB 缓存 转换延迟(ns)
TLB 硬件 页表项缓存 全相联/组相联、LRU 替换 命中率(>99%)
页表 内核+硬件 VA→PA 映射 多级页表、huge page 遍历深度(4/5 级)
伙伴系统 内核 物理页框 2 的幂次链表、合并/分裂 碎片率、分配延迟
slab 分配器 内核 内核对象 对象缓存、着色、每 CPU 缓存 分配/释放吞吐量

1.5 地址转换完整流程

下面这张 SVG 流程图展示了从用户态 malloc 到物理页框的完整路径,帮助你建立全局视角。

地址转换与分配完整流程 地址转换与分配完整流程 用户态:malloc(1024) 内核:查找 VMA / 缺页异常 MMU:遍历页表 (PGD→PTE) TLB 命中? 直接访问物理内存 硬件页表遍历 缺页异常:分配物理页框

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 完整内存子系统分析报告
学习建议:每章都配有可运行的代码示例和内核模块。建议在虚拟机或开发板上同步实验,边学边改。遇到 TLB 或页表相关概念时,多画图、多打印页表内容,直观感受地址转换过程。

1.7 本章小结

本章我们建立了 Linux 内存管理的全景视图:从用户态 mm_struct 到硬件 MMU/TLB,中间经过页表、伙伴系统和 slab 分配器。这张全景图将作为后续 29 章的地图,每深入一个组件,你都能清楚它在大图中的位置与作用。