我怎样才能找到内核空间的内存映射?VA -> PA
我知道/proc/pid/maps
和/proc/pid/mappings
这两个proc
文件系统提供了用户空间应用程序的映射。有类似的方式可以查找内核空间的映射吗?
谢谢!
我怎样才能找到内核空间的内存映射?VA -> PA
我知道/proc/pid/maps
和/proc/pid/mappings
这两个proc
文件系统提供了用户空间应用程序的映射。有类似的方式可以查找内核空间的映射吗?
谢谢!
这是部分答案,或许能帮到你。
Linux将内核虚拟地址空间分为两个部分 - lowmem和vmalloc。
Lowmem使用虚拟地址和物理地址的1-1映射。即虚拟地址X映射到物理地址X-C(其中C是某个常量,例如3GB)。这个映射是在启动时构建的,并且从不更改。
Vmalloc则使用按需动态映射。在每次分配时,会找到一堆物理页、一个虚拟地址范围,并修改页表以创建映射。
两者由虚拟地址隔开。每个部分使用不同的虚拟地址范围。Lowmem范围始终被映射,vmalloc范围在分配时被映射。
实际上,内核空间被划分为LOW和HIGH内存(vmalloc区域是高内存的一部分)。正如ugoren所说的那样,lowmem是直接映射,在引导时构建。例如,可以使用kmap(pkmap区域)将某些用户空间页面映射到高内存中。以下是更详细的图片,您可以在引导时在内核日志中找到。
fixmap : 0xffc57000 - 0xfffff000 (3744 kB)
pkmap : 0xff800000 - 0xffa00000 (2048 kB)
vmalloc : 0xf7ffe000 - 0xff7fe000 ( 120 MB)
lowmem : 0xc0000000 - 0xf77fe000 ( 887 MB)
.init : 0xc0906000 - 0xc0973000 ( 436 kB)
.data : 0xc071ae6a - 0xc08feb78 (1935 kB)
.text : 0xc0400000 - 0xc071ae6a (3179 kB)