核心頁錶轉儲

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