内存是操作系统的核心资源,Linux 通过一套完整的内存管理机制实现进程隔离、资源分配、高效访问和性能优化。理解 Linux 内存架构不仅对内核开发者、驱动开发者至关重要,也对高性能应用优化和系统调优提供基础保障。本文将从内存体系结构、内核内存管理、进程虚拟内存、内存分配机制、页面管理、缓存机制、调优策略以及源码解析等方面,全面剖析 Linux 内存架构。
一、Linux 内存体系结构概览
Linux 内存体系可以从物理内存、虚拟内存和内核内存管理结构三层进行理解:
物理内存(Physical Memory)由硬件提供,单位为页(Page),通常大小为 4KB。物理内存通过页帧(Page Frame)被管理,每一页都有对应的页描述符(struct page)。
虚拟内存(Virtual Memory)Linux 为每个进程提供独立虚拟地址空间,通过页表映射到物理内存。虚拟内存带来了进程隔离和灵活分配能力,支持大页、匿名映射、文件映射等。
内核内存管理(Kernel Memory Management)内核本身也占用内存,包括内核代码、内核数据、页缓存、Slab/SLUB/SLAB 分配器管理的内核对象等。
图示说明 1:Linux 内存架构全景图(物理内存、虚拟内存、内核内存分层)
二、Linux 内存管理基础
2.1 页(Page)与页帧(Page Frame)
页(Page):最小的虚拟内存分配单位,通常 4KB 或 2MB(大页)。
页帧(Page Frame):物理内存的最小分配单位,与页一一对应。
页描述符(struct page):每个物理页对应一个 struct page,用于记录状态、引用计数、标记和链表信息。
Linux 使用页作为管理单位,减少碎片化,提高内存访问效率。
2.2 内存区段(Zones)
内核将物理内存划分为不同 Zone,以支持不同类型的分配需求:
ZONE_DMA:支持低地址 DMA,通常 16MB 以下。
ZONE_NORMAL:常规内存,可直接映射到内核虚拟地址。
ZONE_HIGHMEM:高端内存,不能直接映射到内核虚拟地址,需要 kmap() 临时映射。
图示说明 2:内存分区示意图(DMA / Normal / HighMem)
2.3 内存管理数据结构
buddy 系统:用于物理页分配,支持按幂次分配连续页。
页表(Page Table):实现虚拟页到物理页的映射,支持多级页表(x86: PML4 → PDPT → PD → PT → Page)。
vm_area_struct(VMA):进程虚拟内存区段描述,记录连续虚拟地址区间及权限。
三、内核内存分配机制
3.1 Slab/SLUB/SLAB 分配器
内核使用对象缓存来管理小内存块分配:
图示说明 3:SLUB 内存分配流程图
3.2 kmalloc 与 vmalloc
3.3 内核栈与内核堆
四、用户空间虚拟内存管理
4.1 虚拟内存布局
以 64 位进程为例,用户空间虚拟地址布局如下:
0x0000000000000000 - 0x00007fffffffffff : 用户空间|--- text segment ---|--- data segment ---|--- heap ---|--- mmap ---|--- stack ---|
text segment:存放代码。
data segment:存放全局和静态变量。
heap:动态分配堆(malloc/brk)。
mmap 区域:内存映射文件、共享内存。
stack:栈空间,向低地址增长。
图示说明 4:用户进程虚拟内存布局图
4.2 vm_area_struct(VMA)
4.3 页表与缺页中断
虚拟页访问物理页需通过页表映射。
缺页(Page Fault)由内核处理,包括:
文件映射页:从磁盘加载。
匿名页:分配新的物理页。
访问权限异常:触发 SIGSEGV。
五、页缓存与内存回收机制
5.1 页缓存(Page Cache)
Linux 将文件页缓存到内存,加速文件访问:
file page cache:磁盘文件缓存。
buffer cache:块设备缓冲。
缓存策略包括 LRU 链表管理,支持活跃/非活跃页分类。
5.2 内存回收机制
图示说明 5:内存回收与页缓存管理流程图
六、大页(HugePage)与透明大页(THP)
七、内存 NUMA 架构与优化
7.1 NUMA 概念
非统一内存访问(NUMA)架构中,不同 CPU 节点访问本地内存速度快,访问远程内存慢。Linux 提供 NUMA-aware 分配器:
7.2 NUMA 调度策略
图示说明 6:NUMA 节点内存访问示意图
八、内存调优与性能分析
8.1 内存使用监控工具
8.2 内核参数调优
8.3 高性能场景优化
九、内存管理源码解析
9.1 页分配源码(buddy 系统)
图示说明 7:Buddy 分配器源码流程图
9.2 slab/slub 源码分析
图示说明 8:SLUB 分配器对象缓存管理流程图
9.3 页表与缺页处理源码
图示说明 9:缺页中断处理源码流程图
十、总结
Linux 内存架构涵盖物理内存、虚拟内存、内核内存管理、页缓存、大页机制、NUMA 支持及内存调优策略。理解内核内存数据结构、分配器机制和源码实现,是高性能系统调优、内核开发、驱动开发的重要基础。
通过本文,从体系结构、内核机制、虚拟内存、页缓存、内存回收、大页机制、NUMA 优化到源码解析,读者可以全面掌握 Linux 内存架构全景,为实际开发和性能优化提供理论和实践指导。