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

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

目录

  • 初识 PTDUMP 机制

  • PTDUMP 通识知识

    • PTDUMP 实现原理

    • I386 32bit Virtual Memory Map

    • X86-64 4-level PageTable Virtual Memory Map

    • X86-64 5-level PageTable Virtual Memory Map

    • PTDUMP 数据结构

    • PTDUMP 源码解析

  • PTDUMP 机制实践

  • PTDUMP 机制使用

    • 获得当前进程用户空间页表 C 语言版

    • 获得当前进程内核空间页表 C 语言版

    • DUMP 当前内核空间页表

    • DUMP 当前进程用户空间页表

    • DUMP 当前进程内核空间页表

    • DUMP 当前 EFI 区域页表

  • PTDUMP 应用场景

    • 内核映射区 WX 区域检查场景

    • PTI 用户空间 WX 区域检查场景

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


PTDUMP 通识知识

PTDUMP 机制是为开发者提供的一种调试机制,其可以在用户空间打印当前进程用户空间或者内核空间虚拟内存对应的页表内容. 启用 PTDUMP 机制需要在内核编译阶段使能 CONFIG_PTDUMP_DEBUGFS、CONFIG_PTDUMP_CORE、CONFIG_GENERIC_PTDUMP 宏。在使能 PTDUMP 机制之后,可以在 /sys/kernel/debug/page_tables/ 目录下获得 4 个伪文件,通过读取文件可以获得如下内容:

  • current_user: 获得当前进程虚拟地址空间所有页表内容
  • current_kernel: 获得当前进程切换到内核态虚拟地址空间所有页表内容
  • kernel: 获得内核空间所有页表内容
  • efi: 获得 EFI Region 对应的页表内容

当读取其中某个文件,那么 PTDUMP 机制将输出上图的信息,这些信息按一定格式进行输出,格式定义如下:

  • Region Name: 虚拟内存会划分成几大区域(Region),每个区域都有一个名字,属于该区域的所有虚拟内存都会放在其下面. 常见的区域如用户空间(User Space)、内核空间(Kernel Space)、线性映射区(Low Kernel Mapping) 等.
  • Region Entry: 将页表内容相同的虚拟内存合并在一起的区域,其属于指定 Region 的子集, 其包含了该区域的范围和页表内容信息.
  • Region Entry Range: 该字段表示一段页表相同区域的起始虚拟地址和结束虚拟地址
  • Region Entry Size: 该字段表示一段页表相同区域的长度,单位可以是 KMG
  • PageTable Attribute: 该字段将页表属性的每个位用字符串表示出来,其中 USR 表示页表 U/S 标志位置位, 那么虚拟内存是用户空间; 反之如果没有 USR 字符串则表示 U/S 没有置位,那么虚拟内存是内核空间.
  • Last Pagetable Entry: 该字段表示 Region Entry 对应的最后一级页表信息,e.g. pte 表示区域最后一级页表是 PTE Entry, 同理 pmd 表示区域最后一级页表是 PMD Entry.

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

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

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