1. 缺页中断概述

1.1 缺页中断的定义

缺页中断(Page Fault)是操作系统虚拟内存管理的核心机制。当CPU试图访问一个虚拟地址,而该地址对应的物理页面尚未加载到物理内存中,或者当前访问权限不满足时,MMU(内存管理单元)会触发一个缺页异常。Linux内核的缺页中断处理程序负责解析该异常,执行页面分配、磁盘I/O、权限调整等操作,最终使访问能够正常完成。

关键理解:缺页中断不是错误,而是虚拟内存系统实现“按需加载”和“进程隔离”的基础手段。每次缺页中断都意味着一次虚拟地址到物理地址的延迟绑定。

1.2 缺页中断在虚拟内存管理中的作用

虚拟内存管理将每个进程的虚拟地址空间划分为固定大小的页面(通常为4KB、64KB或2MB)。缺页中断在以下场景中发挥核心作用:

作用维度 具体说明 触发条件
按需加载 程序启动时只加载代码段头部,其余页面在首次访问时通过缺页中断加载 访问未映射的虚拟地址
写时复制(CoW) fork() 后父子进程共享只读页面,写操作触发缺页中断复制物理页 对只读页面执行写操作
页面换入/换出 被换出到交换分区的页面再次访问时,通过缺页中断重新加载 访问标记为“不在内存”的页面
内存映射文件 mmap() 映射的文件区域,首次访问时触发缺页中断从磁盘读取 访问文件映射区中未缓存的页面
栈/堆扩展 进程栈或堆向下/向上增长时,缺页中断分配新的物理页面 访问栈或堆边界之外的地址

1.3 缺页中断与MMU的关系

MMU(Memory Management Unit)是CPU内部负责虚拟地址到物理地址转换的硬件单元。缺页中断与MMU的协作流程如下:

  1. 地址转换失败:MMU在TLB(转译后备缓冲器)和页表中查找虚拟地址对应的页表项(PTE)。
  2. 异常触发:若PTE的“有效位”为0,或权限检查失败,MMU停止执行当前指令,向CPU内核发送缺页异常信号。
  3. 异常向量捕获:ARM64架构下,缺页异常属于同步异常,CPU跳转到异常向量表(Exception Vector Table)中对应的入口。
  4. 内核处理:Linux内核的缺页中断处理程序读取MMU记录的故障地址(FAR_EL1寄存器)和故障状态(ESR_EL1寄存器),执行页面分配或加载。
  5. 恢复执行:处理完成后,内核修改页表并刷新TLB,然后返回到用户态重新执行触发缺页的指令。
ARM64 特有寄存器:FAR_EL1(Fault Address Register)保存触发缺页的虚拟地址;ESR_EL1(Exception Syndrome Register)的低6位编码了缺页类型(如翻译错误、权限错误、对齐错误等)。

1.4 缺页中断分类

根据触发原因和严重程度,缺页中断可分为以下三类:

  • 主要缺页(Major Page Fault):需要从磁盘读取数据,涉及I/O操作,延迟较高(毫秒级)。
  • 次要缺页(Minor Page Fault):页面已在物理内存中(如共享页面、匿名页面),只需建立页表映射,延迟较低(微秒级)。
  • 无效缺页(Invalid Page Fault):访问非法地址(如空指针解引用、越界访问),内核发送SIGSEGV信号终止进程。

1.5 缺页中断处理全流程概览

下图展示了ARM64 Linux内核缺页中断从硬件触发到软件处理的完整路径:

ARM64 缺页中断处理全流程概览 ARM64 缺页中断处理全流程 CPU 执行指令 访问虚拟地址 VA MMU 页表查找 PTE 有效位 = 0 触发缺页异常 ESR_EL1 / FAR_EL1 异常向量 el1_sync 内核缺页入口 do_mem_abort() 缺页分类处理 handle_mm_fault() 次要缺页 建立映射 主要缺页 磁盘I/O + 映射 无效缺页 SIGSEGV 恢复用户态执行 eret 返回

1.6 缺页中断性能指标

缺页中断对系统性能有直接影响,以下是关键性能指标:

指标 典型值 影响因素
次要缺页延迟 0.1 ~ 1 μs 页表遍历深度、TLB刷新开销
主要缺页延迟 1 ~ 10 ms 磁盘寻道时间、I/O带宽、页面大小
缺页中断率 < 1% 命中率时显著影响性能 工作集大小、内存压力、页面置换算法
ARM64 异常向量切换 ~50 ns 异常级别切换(EL0→EL1)、寄存器保存
性能陷阱:频繁的主要缺页中断会导致系统吞吐量急剧下降。在数据库、实时系统等场景中,应通过内存锁定(mlockall())、大页面(HugePages)或提前预加载(MADV_WILLNEED)来减少缺页中断次数。

1.7 本章小结