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

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

目录
  • 初识 PageMap 机制

  • PageMap 通识知识

    • 标准 4KiB 小页映射 Pagemap Entry

    • 标准 2MiB 大页映射 Pagemap Entry

    • 标准 1Gig 大页映射 Pagemap Entry

    • PageMap 数据结构

    • PageMap 源码解析

  • PageMap 机制实践

  • PageMap 机制使用

    • Pagemap 查询映射普通页的页表信息

    • Pagemap 查询没有映射物理页的页表信息

    • Pagemap 查询映射 2MiB Hugetlb 大页页表信息

    • Pagemap 查询映射 THP 大页页表信息

    • Pagemap 查询映射 1Gig 大页页表信息

    • Pagemap 查询映射被 SWAP OUT 物理页页表信息

    • Pagemap 查询映射 MMIO 的页表信息

    • Pagemap 查询匿名映射页表信息

    • Pagemap 查询文件映射页表信息

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


PageMap 通识知识

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

PROC PageMap 机制是 Linux 为每个进程在 /proc/pid 目录下提供了伪文件 pagemap, 其中 pid 为进程的 PID,该机制将进程的用户空间按 PAGE_SIZE 划分成不同的区域,每个区域在 pagemap 文件里对应一个 pagemap_entry_t, 也就是 pagemap 伪文件记录了整个用户空间的 Pagemap Entry,并且按顺序存储所有的 Pagemap Entry. 在第一章节开发者已经见识了 PROC Pagemap 机制使用流程,那么其工作原理如下:

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

PROC PageMap 机制 pagemap 文件提供了 open/lseek/read 三个系统调用,其工作原理如下:

  • A: 当需要获得一个虚拟地址对应的物理内存请求时,首先打开 “/proc/self/pagemap” 文件,以此找到当前进程对应的 pagemap 文件,PROC PageMap 机制 接着将虚拟地址向右移 PAGE_SHIFT, 以此获得对应的页号(Page Number)
  • B: 接着将页号乘以 sizeof(pagemap_entry_t) 以此找到对应的 PTE Entry 位于文件的位置,最后调用 lseek 将文件读写指针定位到该位置.
  • C: 接着调用者通过 read 函数将当前文件读写指针的位置转换成页号(Page Number), 并获得页号对应的虚拟地址。接下来该机制找到虚拟地址对应的 2MiB 对齐的区域,并获虚拟地址到 2MiB 区域结束地址的区域,这个区域暂时称为目标区域.
  • D: 接着调用 PageWalk 机制遍历目标区域里所有的 PTE Entry,并将 PTE Entry 内容都记录在临时缓存里,待遍历完成后按 read 的需求将缓存的数据拷贝到用户空间
  • E: 用户空间读取内容之后,按 Pagemap Entry 的格式对页表内容进行解析,以此获得所需的内容.

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

pagemap 伪文件里面存储了进程虚拟空间所有的 Pagemap Entry,Pagemap Entry 的位图如上,每个 bit 的含义如下:

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

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

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