内核页表转储

ptdump 是一个 debugfs 接口,它提供内核页表的详细转储。它全面概述了内核虚拟内存布局,以及以人类可读格式显示的各区域相关属性。转储内核页表对于验证权限和内存类型非常有用。检查页表项和权限有助于识别潜在的安全漏洞,例如具有过于宽松的访问权限或不当内存保护的映射。

内存热插拔允许在无需重启系统的情况下动态扩展或收缩可用内存。为了维护内存管理数据结构的一致性和完整性,arm64 在写模式下使用 mem_hotplug_lock 信号量。此外,在读模式下,mem_hotplug_lock 支持高效实现 get_online_mems()put_online_mems()。这些机制保护了正被 ptdump 代码访问的内存的下线操作。

为了转储内核页表,请启用以下配置并挂载 debugfs

CONFIG_PTDUMP_DEBUGFS=y

mount -t debugfs nodev /sys/kernel/debug
cat /sys/kernel/debug/kernel_page_tables

通过分析 cat /sys/kernel/debug/kernel_page_tables 的输出,可以获取关于条目虚拟地址范围的信息,接着是该条目覆盖的内存区域大小、页表的层次结构,最后是与每个页面相关的属性。页面属性提供了关于访问权限、执行能力、映射类型(例如叶级 PTE 或块级 PGD、PMD 和 PUD),以及内核内存中页面的访问状态的信息。评估这些属性有助于理解内核页面的内存布局、访问模式和安全特性。

内核虚拟内存布局示例

start address        end address         size             attributes
+---------------------------------------------------------------------------------------+
| ---[ Linear Mapping start ]---------------------------------------------------------- |
| ..................                                                                    |
| 0xfff0000000000000-0xfff0000000210000  2112K PTE RW NX SHD AF  UXN  MEM/NORMAL-TAGGED |
| 0xfff0000000210000-0xfff0000001c00000 26560K PTE ro NX SHD AF  UXN  MEM/NORMAL        |
| ..................                                                                    |
| ---[ Linear Mapping end ]------------------------------------------------------------ |
+---------------------------------------------------------------------------------------+
| ---[ Modules start ]----------------------------------------------------------------- |
| ..................                                                                    |
| 0xffff800000000000-0xffff800008000000   128M PTE                                      |
| ..................                                                                    |
| ---[ Modules end ]------------------------------------------------------------------- |
+---------------------------------------------------------------------------------------+
| ---[ vmalloc() area ]---------------------------------------------------------------- |
| ..................                                                                    |
| 0xffff800008010000-0xffff800008200000  1984K PTE ro x  SHD AF       UXN  MEM/NORMAL   |
| 0xffff800008200000-0xffff800008e00000    12M PTE ro x  SHD AF  CON  UXN  MEM/NORMAL   |
| ..................                                                                    |
| ---[ vmalloc() end ]----------------------------------------------------------------- |
+---------------------------------------------------------------------------------------+
| ---[ Fixmap start ]------------------------------------------------------------------ |
| ..................                                                                    |
| 0xfffffbfffdb80000-0xfffffbfffdb90000    64K PTE ro x  SHD AF  UXN  MEM/NORMAL        |
| 0xfffffbfffdb90000-0xfffffbfffdba0000    64K PTE ro NX SHD AF  UXN  MEM/NORMAL        |
| ..................                                                                    |
| ---[ Fixmap end ]-------------------------------------------------------------------- |
+---------------------------------------------------------------------------------------+
| ---[ PCI I/O start ]----------------------------------------------------------------- |
| ..................                                                                    |
| 0xfffffbfffe800000-0xfffffbffff800000    16M PTE                                      |
| ..................                                                                    |
| ---[ PCI I/O end ]------------------------------------------------------------------- |
+---------------------------------------------------------------------------------------+
| ---[ vmemmap start ]----------------------------------------------------------------- |
| ..................                                                                    |
| 0xfffffc0002000000-0xfffffc0002200000     2M PTE RW NX SHD AF  UXN  MEM/NORMAL        |
| 0xfffffc0002200000-0xfffffc0020000000   478M PTE                                      |
| ..................                                                                    |
| ---[ vmemmap end ]------------------------------------------------------------------- |
+---------------------------------------------------------------------------------------+

cat /sys/kernel/debug/kernel_page_tables 输出

0xfff0000001c00000-0xfff0000080000000     2020M PTE  RW NX SHD AF   UXN    MEM/NORMAL-TAGGED
0xfff0000080000000-0xfff0000800000000       30G PMD
0xfff0000800000000-0xfff0000800700000        7M PTE  RW NX SHD AF   UXN    MEM/NORMAL-TAGGED
0xfff0000800700000-0xfff0000800710000       64K PTE  ro NX SHD AF   UXN    MEM/NORMAL-TAGGED
0xfff0000800710000-0xfff0000880000000  2089920K PTE  RW NX SHD AF   UXN    MEM/NORMAL-TAGGED
0xfff0000880000000-0xfff0040000000000     4062G PMD
0xfff0040000000000-0xffff800000000000     3964T PGD