2022.1月更新,此模块只适用于linux-5.5以下版本,在linux-5.10内核布局空间已发生较大变化。
页表查询模块说明
下面的ko模块可用于查询内核空间及用户程序空间虚拟地址分布及属性,以及查询对应虚拟地址的物理地址。
github地址pid_page_tables
在git根目录Makefile中将KDIR指向自己的linux内核代码目录即可,使用make编译出pid_page_tables.ko。注意此ko适用于arm64架构。
一. 打印内核空间地址分布
使用命令echo kernel > /sys/kernel/debug/pid_page_tables,部分打印如下:
root@xxxxx:~# insmod pid_page_tables.ko
root@xxxxx:~# echo kernel > /sys/kernel/debug/pid_page_tables
root@xxxxx:~# cat /sys/kernel/debug/pid_page_tables
-----[Kernel space]-----
---[ Modules start ]---
0xffff000000d40000-0xffff000000d41000 4K PTE ro x SHD AF NG UXN MEM/NORMAL
0xffff000000d41000-0xffff000000d42000 4K PTE ro NX SHD AF NG UXN MEM/NORMAL
0xffff000000d42000-0xffff000000d44000 8K PTE RW NX SHD AF NG UXN MEM/NORMAL
---[ Modules end ]---
---[ vmalloc() Area ]---
0xffff000008000000-0xffff000008001000 4K PTE RW NX SHD AF NG UXN DEVICE/nGnRE
0xffff000008002000-0xffff000008004000 8K PTE RW NX SHD AF NG UXN DEVICE/nGnRE
0xffff000008005000-0xffff000008006000 4K PTE RW NX SHD AF NG UXN DEVICE/nGnRE
0xffff000008007000-0xffff000008008000 4K PTE RW NX SHD AF NG UXN DEVICE/nGnRE
...
0xffff7dfffee00000-0xffff7dfffee10000 64K PTE RW NX SHD AF NG UXN DEVICE/nGnRE
---[ PCI I/O end ]---
---[ vmemmap start ]---
0xffff7e0000000000-0xffff7e0001000000 16M PMD RW NX SHD AF NG BLK UXN MEM/NORMAL
0xffff7e0002000000-0xffff7e0004000000 32M PMD RW NX SHD AF NG BLK UXN MEM/NORMAL
0xffff7e0006000000-0xffff7e0008000000 32M PMD RW NX SHD AF NG BLK UXN MEM/NORMAL
---[ vmemmap end ]---
---[ Linear Mapping ]---
0xffff800018000000-0xffff800018100000 1M PTE RW NX SHD AF NG CON UXN MEM/NORMAL
0xffff800080000000-0xffff800084000000 64M PMD RW NX SHD AF NG CON BLK UXN MEM/NORMAL
0xffff800084000000-0xffff800084e00000 14M PMD ro NX SHD AF NG BLK UXN MEM/NORMAL
0xffff800084e00000-0xffff800084f00000 1M PTE ro NX SHD AF NG UXN MEM/NORMA
如上,使用echo设置了/sys/kernel/debug/pid_page_tables后cat /sys/kernel/debug/pid_page_tables将会显示所有地址空间映射属性。
内核地址空间分布说明
- [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 pm