图片无法显示,请右键点击新窗口打开图片

BiscuitOS 内存管理之分页大专题订阅入口

目录

  • PageTable on PageFault

    • 基础原理

    • 虚拟地址对齐(Alignment)

    • 页表与缺页

  • 源码逻辑分析

    • PGD/PUD/PMD 页表构建

    • PTE 页表构建

    • HugeTLB 页表构建

  • 实践案例分析

    • Normal Memory 缺页页表构建场景

    • 透明大页内存缺页页表构建场景

    • HugeTLB 内存缺页页表构建场景

    • DAX 内存缺页页表构建过程

    • Huge-DAX 内存缺页页表构建过程

    • PFNMAP 内存缺页页表构建过程

图片无法显示,请右键点击新窗口打开图片


图片无法显示,请右键点击新窗口打开图片

在 Linux 里,进程使用 mmap 等函数从进程的地址空间分配一段虚拟内存,如果采用 LazyAlloc 的方式分配,那么这些分配出来的虚拟内存是没有和物理内存建立页表的,因此当进程访问这段虚拟内存时,MMU 检查到虚拟内存对应的物理内存不存在,那么 MMU 直接触发缺页异常。缺页异常调用缺页异常处理函数进行处理,其核心两个任务就是分配新的物理内存,然后建立虚拟内存到物理内存的页表,待缺页异常处理函数返回之后,进程就可以正常访问这端虚拟内存了。通过分析可以知道缺页异常是建立虚拟内存到物理内存页表的一个很好契机. 本文就详细分析一下缺页异常处理函数如何构建页表.

图片无法显示,请右键点击新窗口打开图片

在研究缺页异建立页表之前,现将发生缺页的虚拟内存进行一下分配,分类的依据来自缺页异常处理函数的处理逻辑,正如上图分作这几类内存:

  • Normal MEM: 进程通过 malloc/brk/mmap 函数分配的普通虚拟内存,其通过缺页最终映射到随机的 4KiB 物理页上. 可以是匿名内存,也可以是共享内存,也可以是文件映射内存.
  • TH MEM: 进程通过 mmap 分配不小于 2MiB 的虚拟内存,被 THP 机制合成的透明大页内存. 可以是匿名透明大页,也可以是文件透明大页. 透明大页有 2MiB 和 1Gig 两种.
  • HugeTLB MEM: 进程通过 mmap 从 HugeTLB 大页池子里分配的内存,HugeTLB 内存相对独立的大页内存,具有 2MiB 和 1Gig 两种粒度大页.
  • DAX MEM: 进行绕过文件 I/O 和块设备层,进程直接将虚拟内存映射到物理区域上(PFN), 具有 2MiB 和 4KiB 两种粒度.
  • PFNMAP: 进程通过 mmap 分配虚拟内存映射到设备管理的物理内存上,具有 4KiB、2MiB 和 1Gig 粒度

图片无法显示,请右键点击新窗口打开图片

BiscuitOS 内存管理之分页大专题订阅入口

图片无法显示,请右键点击新窗口打开图片