mm目录下文件的主要功能
Linux内核源码的mm目录是内存管理子系统的核心,包含了所有与硬件体系结构无关的内存管理代码。它的主要功能可以划分为几个关键部分,下面是一些核心文件及其作用的分类介绍:
核心与基础管理
这部分代码实现了内存管理最底层的框架和基础功能。
page_alloc.c:这是整个内存管理的核心之一,负责物理页面的分配与释放,实现了著名的伙伴系统(Buddy System)算法,用于高效地管理连续的物理内存块。memory.c:处理核心的内存管理操作,涵盖了页表的建立与管理、虚拟内存的缺页异常处理(demand-paging),以及内存映射等基础机制。vmalloc.c:实现了vmallocAPI,负责在虚拟地址空间中分配一段连续的内存区域,而这段区域所对应的物理内存页框可以是不连续的。slab.c/slub.c:实现了SLAB/SLUB分配器,这是基于伙伴系统之上的更高级分配器。它通过缓存常用大小的对象(如进程描述符),来加速内核中频繁进行的小内存分配与释放,并减少内存碎片。
进程地址空间与文件映射
这部分管理每个进程看到的虚拟地址空间。
mmap.c:实现了mmap系统调用,负责在进程的虚拟地址空间中创建内存映射,既包括将文件映射到内存,也包括创建匿名的内存区域。filemap.c:实现了页面缓存(Page Cache)的核心功能。它负责将文件数据缓存在内存中,以加速文件读写操作,是文件系统和块设备层之间的重要桥梁。rmap.c:实现了反向映射(Reverse Mapping)技术。它允许内核从一个物理内存页框,快速找到所有映射了该页框的进程页表项,这在页面回收和换出时至关重要。
页面交换与回收
这部分代码负责在内存紧张时回收内存。
vmscan.c:这是页面回收(Page Reclaim)机制的核心实现。它根据LRU(最近最少使用)算法,在内存不足时扫描并回收不常用的页面(如换出到交换分区或丢弃干净页)。swap.c/swapfile.c:实现了交换(Swap)功能,管理用于交换的设备或文件,并负责将内存页面换出到磁盘以及从磁盘换入。page-writeback.c:管理脏页(Dirty Page)回写,负责将页面缓存中被修改过的数据(脏页)定期或按需写回到磁盘,以保持数据一致性。
特定功能与辅助模块
mm目录下还包含许多其他重要模块,用于处理特定场景:
mempool.c:实现内存池(Memory Pool)机制,预先分配一定数量的内存对象,用于在内存紧张的关键路径(如块设备I/O)中保证分配成功。dmapool.c:实现DMA内存池,为直接内存访问(DMA)设备提供小块、一致性的内存分配与释放,这些内存通常需要是物理连续的。hugetlb.c:支持大页(HugeTLB)功能,管理大尺寸的内存页(如2MB或1GB),这对于需要大量连续内存且对性能要求高的应用(如数据库)很有用。ksm.c:实现了内核同页合并(Kernel Samepage Merging, KSM),它会在系统中扫描并合并内容完全相同的匿名内存页,常被用于虚拟化场景以节省内存。percpu.c:提供每CPU变量(Per-CPU Variable)的分配和管理机制,为每个CPU核心分配独立的内存副本,可以避免多核间的锁竞争,提升性能。memblock.c:用于系统初始化早期的内存管理器。在伙伴系统正式工作前,它负责管理系统的物理内存布局。
此外,像
bootmem.c(引导内存分配器)、highmem.c(高端内存管理)等功能在较新内核中可能已被整合或替代,但它们代表了一些重要的历史或特定架构功能。处理NUMA(非统一内存访问)架构的策略则分布在mempolicy.c等文件中。
