VMA(Virtual Memory Area)
每个进程都有自己的虚拟地址空间(Userspace), 并且被换分成不同的区域,Linux 内核将属性相同的虚拟内存区域统一使用 struct vm_area_struct 数据结构进行描述,简称这样的虚拟内存区域为 VMA。VMA 的属性包括: 读、写、执行、私有、共享、匿名、文件、大页 等,只要在同一个 VMA 区域内存的虚拟内存,那么他们的属性一定相同。VMA 的属性构成了分页机制的权限管理,例如有的 VMA 是只读的,那么不能对该区域的内存进行写操作,否则会引发页表故障; 另外 VMA 区域内存的内存行为是一致的,例如都采用同样内存分配逻辑和缺页逻辑。说这么多,记下来从数据结构角度进行分析:
struct vm_area_struct 数据结构绝对是一个非常复杂的数据结构体,这里只对缺页机制相关的成员进行讲解, 其余的成员或多或少与缺页机制有关,但不是起到核心作用的成员:
- vm_start/vm_end: 两个成员限定了 VMA 区域的访问, 其值是虚拟地址
- vm_mm: 指向了进程的地址空间数据结构 struct mm_struct
- vm_page_prot: 记录 VMA 区域虚拟内存构建页表时的页表属性内容
- vm_flags: 记录了 VMA 区域的标志
- vm_ops: 当需要对虚拟内存操作时,提供指定的处理函数
- vm_offset: 相对与 VMA 起始地址的偏移值
- vm_file: 虚拟区域映射的文件