目录
初识 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 的含义如下: