1. Linux 虚拟内存的 VMA(Virtual Memory Area)与 page fault 流程
解释 Linux 虚拟内存中的 VMA(Virtual Memory Area)结构,以及一次 page fault 缺页异常的完整处理流程?
- 理解 VMA 描述进程虚拟地址空间的分段映射
- 理解 page fault 的层次:VMA 查找、pte 建立、物理页分配
- 理解 major/minor fault 的分流
VMA(Virtual Memory Area)是进程虚拟地址空间中一个连续映射的段,由 vm_area_struct 描述,包含起始/结束地址、权限(读/写/执行)、映射对象(文件或匿名)、flags 等。进程的 mm_struct 维护一个 VMA 链表/红黑树,用于快速查找地址对应的 VMA。当进程访问一个未建立映射的地址时发生 page fault,处理流程为:先通过缺页地址在 VMA 树中查找对应的 VMA,若不在任何 VMA 内则触发 SIGSEGV;若找到 VMA,则分配或找到对应的物理页并建立页表项(pte),同时处理权限与 COW 等情况。若页在 page cache 中命中(如文件已被读取过),则只需建立页表(minor fault,快);若需要从磁盘读取,则发起磁盘 I/O(major fault,慢)。处理完成后通过 do_page_fault 返回,重新执行被中断的指令。
VMA 是"虚拟内存地图",page fault 是"按需映射"的触发点。理解 VMA 查找与 fault 分流(major/minor)是剖析内存分配、mmap、写时复制、文件 IO 性能的基础。