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的协作流程如下:
- 地址转换失败:MMU在TLB(转译后备缓冲器)和页表中查找虚拟地址对应的页表项(PTE)。
- 异常触发:若PTE的“有效位”为0,或权限检查失败,MMU停止执行当前指令,向CPU内核发送缺页异常信号。
- 异常向量捕获:ARM64架构下,缺页异常属于同步异常,CPU跳转到异常向量表(Exception Vector Table)中对应的入口。
- 内核处理:Linux内核的缺页中断处理程序读取MMU记录的故障地址(FAR_EL1寄存器)和故障状态(ESR_EL1寄存器),执行页面分配或加载。
- 恢复执行:处理完成后,内核修改页表并刷新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内核缺页中断从硬件触发到软件处理的完整路径:
1.6 缺页中断性能指标
缺页中断对系统性能有直接影响,以下是关键性能指标:
| 指标 | 典型值 | 影响因素 |
|---|---|---|
| 次要缺页延迟 | 0.1 ~ 1 μs | 页表遍历深度、TLB刷新开销 |
| 主要缺页延迟 | 1 ~ 10 ms | 磁盘寻道时间、I/O带宽、页面大小 |
| 缺页中断率 | < 1% 命中率时显著影响性能 | 工作集大小、内存压力、页面置换算法 |
| ARM64 异常向量切换 | ~50 ns | 异常级别切换(EL0→EL1)、寄存器保存 |
性能陷阱:频繁的主要缺页中断会导致系统吞吐量急剧下降。在数据库、实时系统等场景中,应通过内存锁定(mlockall())、大页面(HugePages)或提前预加载(MADV_WILLNEED)来减少缺页中断次数。