引言
Linux内核的内存管理是整个操作系统中最复杂、最核心的子系统之一。它不仅负责物理内存的分配与回收,还实现了虚拟内存、页面交换、内存映射等高级功能。本文将从底层硬件特性出发,深入解析Linux内核内存管理的完整架构。
一、物理内存管理
1.1 页帧与页表
Linux将物理内存划分为固定大小的页帧(Page Frame),通常大小为4KB。每个页帧由一个struct page数据结构描述,该系统通过mem_map数组全局管理所有物理页。
页表是虚拟地址到物理地址映射的硬件机制。x86-64架构采用四级页表结构:
- PGD (Page Global Directory) - 顶层页目录
- P4D (Page 4th Level Directory) - 第四级目录
- PUD (Page Upper Directory) - 上级目录
- PMD (Page Middle Directory) - 中间目录
- PTE (Page Table Entry) - 页表项
1.2 伙伴系统 (Buddy System)
伙伴系统是Linux内核物理内存分配的核心算法。它将空闲页面按大小分组,每组包含2^n个连续页面(n=0,1,...,MAX_ORDER-1)。分配时:
- 请求大小向上取整到最近的2的幂
- 在对应阶数的空闲链表中查找空闲块
- 若无可用块,从更大阶数的链表中拆分
- 释放时检查相邻块是否为伙伴,若是则合并
二、虚拟内存管理
2.1 进程地址空间
每个进程拥有独立的虚拟地址空间,由mm_struct结构管理。Linux将用户空间典型布局分为:代码段、数据段、堆、内存映射段、栈等区域。
2.2 反向映射 (Reverse Mapping)
反向映射机制允许系统快速找到映射某个物理页面的所有虚拟地址。这对页面回收至关重要,内核需要撤销所有映射才能安全释放页面。Linux使用anon_vma链表管理匿名页的反向映射。
三、页面回收与交换
3.1 LRU算法
Linux采用改进的双链LRU算法维护活跃与非活跃页面列表。页面在被访问时移至活跃链表尾部,当非活跃链表页面长期未被访问则被回收。
3.2 Swap机制
当物理内存不足时,内核将不活跃的匿名页面写入磁盘交换空间。Linux支持交换分区和交换文件两种形式,并支持zswap压缩交换。
四、SLUB分配器
SLUB是Linux内核默认的SLAB分配器变体,优化了小对象分配性能。每个CPU维护本地缓存,使用cmpxchg实现无锁快速路径。SLAB/SLUB用于内核内部的大小对象分配,避免伙伴系统的外部碎片问题。
五、内存压缩与KSM
5.1 ZRAM/ZSWAP
ZSWAP在页面交换时进行压缩存储,延迟写入磁盘。ZRAM则创建基于RAM的块设备,适用于内存受限嵌入式系统。
5.2 KSM (Kernel Samepage Merging)
KSM扫描内存查找内容相同的页面,合并为只读共享页。在虚拟化环境中可显著节省内存,但存在CPU开销。
总结
Linux内存管理是一个经过数十年优化的精密系统,从底层伙伴系统到上层cgroup内存控制,每一层都经过精心设计。理解这些机制对于系统调优、故障排查和内核开发都至关重要。

发表评论 取消回复