内核虚拟内存如何映射到物理内存

时间:2013-12-09 20:57:12

标签: linux memory-management linux-kernel

如何找出内核空间的内存映射? VA - > PA

我知道proc文件系统/proc/pid/maps& /proc/pid/mappings为我们提供了用户空间应用程序的映射。什么类似于查找内核空间映射?

谢谢!

2 个答案:

答案 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