欢迎访问 内存溢出 —— 独立后端与系统工程技术博客

专注于分布式系统、Linux内核、数据库存储与后端工程实践

深入理解 Linux 虚拟内存:VMA 与缺页异常处理

发表于:|最后更新:|分类:Linux与网络|阅读:2022 次

Linux 进程看到的连续虚拟地址空间,本质上由一系列 虚拟内存区域(VMA, Virtual Memory Area) 描述,每个 VMA 对应一段具有相同权限与映射属性的地址区间。内核使用红黑树组织所有 VMA,以支持 O(log n) 的地址查找。

一、VMA 的核心结构

c
struct vm_area_struct {
    unsigned long vm_start;
    unsigned long vm_end;
    struct mm_struct *vm_mm;
    pgprot_t vm_page_prot;
    struct rb_node vm_rb;
};

当进程访问一个尚未建立物理页映射的虚拟地址时,CPU 会触发缺页异常(Page Fault),内核在 handle_mm_fault() 中判定异常类型:匿名页缺页、文件映射缺页或写时复制(COW)。合理设置 vm.overcommit_memory 与 vm.min_free_kbytes 是避免 OOM 与内存抖动的关键。