核心頁表除錯

yooooooo發表於2024-03-03

一、配置核心

首先配置核心,使其支援匯出核心頁表到debugfs下面:
Kernel hacking --->
---> [*] Export kernel pagetable layout to userspace via debugfs
配置完後,重新編譯核心,並用新核心啟動,就會在/sys/kernel/debug下看到kernel_page_tables檔案:

然後cat該檔案,可以獲得如下資訊:

[root@vexpress debug]# cat kernel_page_tables
---[ Modules ]---
0xbfe01000-0xbfe1e000         116K     RW NX SHD MEM/CACHED/WBWA
---[ Kernel Mapping ]---
0xc0000000-0xc0100000           1M     RW NX SHD
0xc0100000-0xc0700000           6M     ro x  SHD
0xc0700000-0xc0900000           2M     ro NX SHD
0xc0900000-0xf0000000         759M     RW NX SHD
---[ vmalloc() Area ]---
0xf0800000-0xf0801000           4K     RW NX SHD DEV/SHARED
0xf0802000-0xf0803000           4K     RW NX SHD DEV/SHARED
0xf0804000-0xf0805000           4K     RW NX SHD DEV/SHARED
0xf0806000-0xf0807000           4K     RW NX SHD DEV/SHARED
0xf0808000-0xf0809000           4K     RW NX SHD DEV/SHARED
0xf080a000-0xf080b000           4K     RW NX SHD DEV/SHARED
0xf080c000-0xf080d000           4K     RW NX SHD DEV/SHARED
0xf0814000-0xf0815000           4K     RW NX SHD DEV/SHARED
0xf0816000-0xf0817000           4K     RW NX SHD DEV/SHARED
0xf0818000-0xf0819000           4K     RW NX SHD DEV/SHARED
0xf081a000-0xf081b000           4K     RW NX SHD DEV/SHARED
0xf081c000-0xf085c000         256K     RW NX SHD MEM/BUFFERABLE/WC
0xf085d000-0xf085e000           4K     RW NX SHD DEV/SHARED
0xf085f000-0xf0860000           4K     RW NX SHD DEV/SHARED
0xf0861000-0xf0862000           4K     RW NX SHD DEV/SHARED
0xf0875000-0xf0876000           4K     RW NX SHD DEV/SHARED
0xf0879000-0xf087a000           4K     RW NX SHD DEV/SHARED
0xf087d000-0xf087e000           4K     RW NX SHD DEV/SHARED
0xf0889000-0xf088a000           4K     RW NX SHD DEV/SHARED
0xf088b000-0xf088c000           4K     RW NX SHD DEV/SHARED
0xf088d000-0xf0898000          44K     RW NX SHD MEM/CACHED/WBWA
0xf0899000-0xf08db000         264K     RW NX SHD MEM/CACHED/WBWA
0xf08dc000-0xf08e7000          44K     RW NX SHD MEM/CACHED/WBWA
0xf08e8000-0xf0908000         128K     RW NX SHD MEM/CACHED/WBWA
0xf0909000-0xf0929000         128K     RW NX SHD MEM/CACHED/WBWA
0xf092a000-0xf094a000         128K     RW NX SHD MEM/CACHED/WBWA
0xf094b000-0xf096b000         128K     RW NX SHD MEM/CACHED/WBWA
0xf096c000-0xf098c000         128K     RW NX SHD MEM/CACHED/WBWA
0xf098d000-0xf09ad000         128K     RW NX SHD MEM/CACHED/WBWA
0xf09ae000-0xf09ce000         128K     RW NX SHD MEM/CACHED/WBWA
0xf09cf000-0xf09ef000         128K     RW NX SHD MEM/CACHED/WBWA
0xf09f0000-0xf09f1000           4K     RW NX SHD DEV/SHARED
0xf09f2000-0xf09f3000           4K     RW NX SHD DEV/SHARED
0xf09f4000-0xf09f5000           4K     RW NX SHD DEV/SHARED
0xf09f6000-0xf0b76000        1536K     RW NX SHD MEM/BUFFERABLE/WC
0xf0b77000-0xf0b78000           4K     RW NX SHD DEV/SHARED
0xf0b79000-0xf0b7a000           4K     RW NX SHD DEV/SHARED
0xf0b80000-0xf1380000           8M     RW NX SHD DEV/SHARED
0xf1385000-0xf1386000           4K     RW NX SHD DEV/SHARED
0xf1387000-0xf1388000           4K     RW NX SHD DEV/SHARED
0xf1389000-0xf138a000           4K     RW NX SHD DEV/SHARED
0xf138b000-0xf138c000           4K     RW NX SHD DEV/SHARED
0xf138d000-0xf138e000           4K     RW NX SHD DEV/SHARED
0xf1390000-0xf13a0000          64K     RW NX SHD DEV/SHARED
0xf13aa000-0xf13b5000          44K     RW NX SHD MEM/CACHED/WBWA
0xf13b6000-0xf13b9000          12K     RW NX SHD MEM/CACHED/WBWA
0xf1400000-0xf5400000          64M     RW NX SHD DEV/SHARED
0xf5401000-0xf5425000         144K     RW NX SHD MEM/CACHED/WBWA
0xf5480000-0xf7480000          32M     RW NX SHD DEV/SHARED
0xf8009000-0xf800a000           4K     RW NX SHD DEV/SHARED
0xf8080000-0xfc080000          64M     RW NX SHD DEV/SHARED
---[ vmalloc() End ]---
---[ Fixmap Area ]---
0xffecd000-0xffecf000           8K     RW NX SHD MEM/CACHED/WBWA
0xffedd000-0xffedf000           8K     RW NX SHD MEM/CACHED/WBWA
0xffeed000-0xffeef000           8K     RW NX SHD MEM/CACHED/WBWA
0xffefd000-0xffeff000           8K     RW NX SHD MEM/CACHED/WBWA
---[ Vectors ]---
0xffff0000-0xffff1000           4K USR ro x  SHD MEM/CACHED/WBWA
0xffff1000-0xffff2000           4K     ro x  SHD MEM/CACHED/WBWA
---[ Vectors End ]---

上面每一行的含義:被對映的虛擬地址的範圍、大小以及該段記憶體所具備的屬性

核心地址空間分佈說明

[Modules start] - [Modules end]模組載入使用到的核心空間,現在只載入了pid_page_tables.ko故只顯示了三行對映資料。

[vmalloc() Area] - [vmalloc() End]所有vmalloc申請的,核心本身程式碼,mmap,ioremap等申請的地址空間在這一個區域。

[Fixmap start] - [Fixmap end]arm64核心啟動後為了能夠讀取裝置樹所做的一段Fixmap,用於前期對映使用其中包括了裝置樹對映,early ioremap,fix pgd,fix pud,fix pmd等的對映。

[PCI I/O start] - [PCI I/O end]同上,專門用於PCI裝置使用的地址空間,一般對映大小為16M

[vmemmap start] - [vmemmap end]對與ARM64用於page對映區,linux核心用page結構體管理所有實體記憶體,每一頁大小為PAGE_SIZE對於arm64,可能是4K,16K,64K。而為了快速方便找到對應物理頁而將所有的頁幀結構體對映到此區域,後續只需使用virt_to_page, phys_to_page等宏實現虛擬地址,實體地址到對應頁結構體的快速查詢。

[Linear Mapping]此區域為線性對映區,所有的實體記憶體透過mem_map全部對映到此區域,用於夥伴系統分配,並且可使用virt_to_phys, phys_to_virt進行地址轉換。

地址空間port屬性說明

第一列 當前頁表的對映範圍地址
第二列 代表此對映範圍大小
PMD PUD PTE 當標識為PMD PUD表示當前對映為block對映,如當前頁表為4K,則pud的block對映一次性可對映1G範圍,pmd的block對映可一次性對映2M範圍。當標識為PTE表示為頁表對映即PAGE_SIZE大小4K。
USR AP標記,用於標識當前範圍是否在使用者空間還是核心空間可讀可寫或者僅讀。
ro RW 當前地址範圍讀寫許可權,ro僅讀,RW可讀可寫
NX x NX表述當前範圍特權級別模式不可執行,就是核心不能執行這段地址程式碼。
x表述當前範圍特權級別模式可執行,就是核心的可執行程式碼段,在核心中這段一般指向核心的text*段
SHD 表示可共享屬性,在arm64上表述為多核之間可共享其頁表可見
AF 訪問標誌,當首次對映頁表時,如果不置位,則第一次訪問將會產生異常,可用於標記新頁的首次訪問,對於核心而言首次對映會將此bit置位。
NG 此標誌可用於全域性一致性。表示非全域性。
CON 對於cpu進行地址翻譯過程,為了能夠避免多次的查詢翻譯過程,CON bit可用於標識當前對映為一個連續區域,則cpu可進行連續預取加速翻譯過程。
BLK 對於PUD和PMD block對映的都會被標記為BLK
UXN MEM 標識非特權模式是否可執行,UXN表示當前範圍使用者空間不可執行,MEM表示當前範圍使用者空間可執行。
NORMAL/NORMAL-NC DEVICE/DEVICE/nGnRE等 arm64中一共標識了六種記憶體屬性,下面說明使用到的:
對於系統RAM區,一般標識為NORMAL即普通記憶體可快取,NORMAL-NC則不會經過cache cpu直接進行記憶體讀寫。
DEVICE/DEVICE/nGnRE等用於標識裝置地址空間,此段空間除了不會經過cache外,cpu還會進行透傳回寫排序等操作限制,具體讀寫方式與G R E標識相關,感興趣可參考ARMv8手冊

相關文章