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