一、配置核心
首先配置核心,使其支援匯出核心頁表到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手冊 |