如何找出内核空间的内存映射? VA - > PA
我知道proc
文件系统/proc/pid/maps
& /proc/pid/mappings
为我们提供了用户空间应用程序的映射。什么类似于查找内核空间映射?
谢谢!
答案 0 :(得分:11)
这是一个部分答案,也许会有所帮助。
Linux将内核虚拟地址空间分为两部分 - lowmem和vmalloc。
Lowmem使用虚拟和物理地址之间的1-1映射。即虚拟地址X被映射到物理地址X-C(其中C是一些常数,例如3GB)。此映射是在引导期间构建的,永远不会更改。
Vmalloc根据需要使用动态映射。在每次分配时,找到一堆物理页面和一个虚拟地址范围,并修改分页表以创建映射。
两个由虚拟地址分隔。每个使用不同的虚拟地址范围。始终映射lowmem范围,在分配时映射vmalloc范围。
答案 1 :(得分:2)
实际上,内核空间分为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)
在这个示例中,1Gb内核空间分为887低内存和120高内存。正如您可以看到vmalloc区域占用120 MB的高内存,而pkmap和fixmap区域仅保留2和3 Kbs。关于修补映射,您可以在此处阅读http://embeddedma.blogspot.ru/2013/06/linux-fixmap-role.html。