一张图搞明白Linux 内存管理

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_RPTE_WPTE_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_structfile_struct

6. 内存回收与交换
  • kswapd 守护进程:定期检查内存使用情况,触发页回收

  • LRU 算法:最近最少使用(Least Recently Used)页优先回收

  • 交换空间:将不活跃页换出到磁盘(swap 分区或文件)

  • 内存压缩:压缩不活跃页,释放物理内存(ZRAM)
7. 硬件抽象层
  • MMU(内存管理单元):实现虚拟地址到物理地址的转换

  • TLB(转换后援缓冲器):缓存最近使用的页表项

  • 缓存一致性:确保 CPU 缓存与主存数据一致(如MESI协议)

  • NUMA 支持:处理非统一内存访问架构,优化内存访问路径

三、总结

Linux内存管理子系统通过多层次抽象和模块化设计,实现了复杂而高效的内存管理。从用户空间的简单接口到硬件层的精细控制,每个组件都承担特定职责并协同工作,既保证了应用程序的灵活性,又优化了物理内存的使用效率。

了解Linux内存管理子系统架构有助于对Linux内存管理子系统建立一个宏观认识,为进一步深入学习Linux内存管理子系统指明方向。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值