內核頁表調試

一、配置內核

首先配置內核,使其支持導出內核頁表到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手冊
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章