Linux内存管理子系统是一个复杂且功能强大的系统,它的主要目标是高效地管理系统内存资源,为用户空间程序和内核自身提供稳定、可靠的内存分配与回收机制,同时还要兼顾不同硬件平台的特性。
一、内存管理子系统总体架构
Linux内存管理子系统设计了多层次架构,涉及硬件抽象、物理内存管理、虚拟内存管理、内存分配策略等多个维度。以下是其核心组件和交互关系的系统框架图:
二、核心组件介绍
1. 用户空间接口层
内存分配函数:malloc()/free()(C 库)、new/delete(C++)
- 内存映射
:
mmap()/munmap()(文件映射、匿名映射)
堆管理:
brk()/sbrk()
(调整进程堆边界)- 特殊内存:
posix_memalign()
(对齐内存分配)、memalign()
(历史接口)
2. 系统调用层
- 核心系统调用:
sys_brk()
、sys_mmap()
、sys_munmap()
- 内存保护:
sys_mprotect()
(修改内存区域访问权限) - 内存统计:
sys_mincore()
(查询内存页是否在物理内存中) - 交换空间:
sys_swapon()
/sys_swapoff()
(启用 / 禁用交换间)
3. 虚拟内存管理(VMM)
进程地址空间:struct mm_struct(每个进程一个实例)
虚拟内存区域:
struct vm_area_struct
(VMA 链表管理不同内存区域)页表管理:
四级页表:pgd(页全局目录)→ pud(页上级目录)→ pmd(页中间目录)→ pte(页表项)
大页支持:直接使用pmd或pgd映射 2MB/1GB 内存
- 内存保护:通过页表项的标志位(如
PTE_R
、PTE_W
、PTE_X
)实现访问控制
4. 物理内存管理(PMM)
内存域(Zone):
ZONE_DMA:低地址内存,用于传统 ISA 设备 DMA
ZONE_NORMAL:常规可直接映射的内存
ZONE_HIGHMEM:高端内存,需通过动态映射访问(32 位系统)
- 伙伴系统(Buddy System):
按 2^n 页块管理空闲内存(如 1、2、4、8... 页)
解决外部碎片化问题(合并相邻空闲块)
- 页帧分配器:
alloc_pages():分配连续物理页
__get_free_page():简化接口,分配单个页
kmalloc():基于 slab 分配器,分配小内存块
5. 特殊内存分配机制
CMA(Contiguous Memory Allocator):预留连续内存,支持动态复用和页迁移
HugeTLB/HugePage:大页机制,减少 TLB 压力
vmalloc():分配虚拟连续、物理离散的内存(通过页表映射)
slab分配器:管理内核对象缓存(如
task_struct
、file_struct
)
6. 内存回收与交换
- kswapd 守护进程:定期检查内存使用情况,触发页回收
- LRU 算法:最近最少使用(Least Recently Used)页优先回收
- 交换空间:将不活跃页换出到磁盘(swap 分区或文件)
- 内存压缩:压缩不活跃页,释放物理内存(ZRAM)
7. 硬件抽象层
- MMU(内存管理单元):实现虚拟地址到物理地址的转换
- TLB(转换后援缓冲器):缓存最近使用的页表项
- 缓存一致性:确保 CPU 缓存与主存数据一致(如MESI协议)
- NUMA 支持:处理非统一内存访问架构,优化内存访问路径
三、总结
Linux内存管理子系统通过多层次抽象和模块化设计,实现了复杂而高效的内存管理。从用户空间的简单接口到硬件层的精细控制,每个组件都承担特定职责并协同工作,既保证了应用程序的灵活性,又优化了物理内存的使用效率。
了解Linux内存管理子系统架构有助于对Linux内存管理子系统建立一个宏观认识,为进一步深入学习Linux内存管理子系统指明方向。