1. 内存管理概述:物理内存与虚拟内存概念、MMU硬件基础、内存管理子系统架构图

1.1 物理内存与虚拟内存

内存管理是操作系统内核最核心的子系统之一。在早期单任务系统中,程序直接访问物理内存地址,这种方式简单但存在严重缺陷:程序之间缺乏隔离、地址空间无法扩展、内存碎片化严重。现代操作系统通过引入虚拟内存机制彻底解决了这些问题。

概念 定义 关键特征
物理内存 硬件实际提供的RAM存储单元,由内存控制器直接管理 容量有限(如8GB/16GB);地址连续但存在空洞;所有进程共享
虚拟内存 操作系统为每个进程提供的独立、连续的地址空间抽象 大小可超过物理内存(依赖交换机制);进程间隔离;按需分配
地址转换 将虚拟地址映射到物理地址的过程,由MMU硬件完成 以页为单位(典型4KB);页表存储映射关系;TLB加速查找
核心观点:虚拟内存让每个进程都认为自己拥有从0到最大地址空间的连续内存,而实际物理内存分配由内核按需完成。这种抽象极大简化了程序开发,同时提供了内存保护和共享的基础。

1.2 MMU硬件基础

内存管理单元(Memory Management Unit, MMU)是CPU内部负责地址转换的硬件模块。它接收CPU发出的虚拟地址,通过查找页表将其转换为物理地址,然后发送给内存控制器。MMU是现代处理器实现虚拟内存的硬件基石。

MMU核心工作流程

  1. CPU执行指令,发出虚拟地址(VA)
  2. MMU将VA拆分为页号和页内偏移
  3. MMU查询TLB(快表),若命中则直接获得物理页框号
  4. 若TLB未命中,MMU遍历页表(多级页表结构)查找映射
  5. 找到映射后,将物理页框号与偏移组合成物理地址(PA)
  6. 若页表项无效(缺页),MMU触发缺页异常,由内核处理
关键硬件参数:典型x86_64架构使用4级页表(PML4→PDPT→PD→PT),每级9位索引,页内偏移12位,共48位虚拟地址空间。ARMv8-A使用3级或4级页表,支持4KB/16KB/64KB页面。
MMU 地址转换流程 CPU 虚拟地址 VA MMU 地址转换 TLB 快表 页表 物理地址 PA 物理内存 缺页异常 页表项无效

1.3 内存管理子系统架构

Linux内核的内存管理子系统是一个分层、模块化的复杂系统。从最底层的硬件接口到最上层的系统调用,每一层都有明确的职责和接口。理解整体架构是深入学习内存管理的第一步。

架构分层与职责

层级 核心组件 主要职责
硬件抽象层 MMU驱动、TLB管理、页表操作 封装CPU架构差异(x86/ARM/RISC-V);提供页表遍历/修改原语
物理内存管理 伙伴系统(Buddy)、slab分配器、页分配器 管理物理页框的分配与回收;处理内存碎片;提供通用内存分配接口
虚拟内存管理 VMA(虚拟内存区域)、缺页异常处理、mmap 管理进程地址空间;处理缺页;实现内存映射文件
内核内存分配 kmalloc、vmalloc、percpu分配器 为内核模块提供不同特性的内存分配(连续/非连续/每CPU)
回收与压缩 kswapd、LRU链表、内存压缩、OOM killer 在内存压力下回收页面;压缩碎片;极端情况下杀死进程
系统调用接口 brk、mmap、munmap、mprotect、madvise 向用户空间提供内存管理操作入口
架构理解要点:不要将内存管理子系统视为一个整体黑盒。每个层级都有独立的锁、数据结构和算法。例如,伙伴系统管理物理页框,而VMA管理虚拟地址区间,两者通过页表建立映射。缺页异常是连接虚拟和物理的桥梁。
Linux 内存管理子系统架构 用户空间(User Space) 系统调用接口:brk / mmap / munmap / mprotect / madvise 虚拟内存管理 VMA管理 / 缺页异常处理 内存映射文件 / 交换 内核内存分配 kmalloc / vmalloc / kvmalloc percpu分配器 / 原子分配 物理内存管理 伙伴系统(Buddy) slab分配器 / 页分配器 回收与压缩 kswapd / LRU链表 内存压缩 / OOM killer 硬件抽象层:MMU驱动 / TLB管理 / 页表操作(x86/ARM/RISC-V) 硬件:CPU / RAM / 内存控制器

1.4 关键数据结构预览

在后续章节中,我们将深入分析每个子系统的实现。这里先预览几个贯穿整个内存管理子系统的核心数据结构:

  • struct page:物理页框的描述符,每个物理页框对应一个page结构,包含标志位、引用计数、LRU链表节点等
  • struct vm_area_struct (VMA):描述进程地址空间中的一个连续虚拟内存区域,包含起始地址、结束地址、权限标志、文件映射信息等
  • struct mm_struct:进程的内存描述符,包含页表基址、VMA链表、代码段/数据段/堆/栈区域信息
  • pgd_t / pud_t / pmd_t / pte_t:多级页表项类型,封装了硬件页表项的格式
学习路径建议:本章建立了内存管理的整体视图。接下来第2章将深入物理内存管理,详细分析伙伴系统的分配与合并算法、slab分配器的设计思想。建议读者在继续学习前,先理解本章的架构分层和MMU转换流程,这是后续所有内容的基础。