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

13

我怎样才能找到内核空间的内存映射?VA -> PA

我知道/proc/pid/maps/proc/pid/mappings这两个proc文件系统提供了用户空间应用程序的映射。有类似的方式可以查找内核空间的映射吗?

谢谢!


有点过时,但仍然相关:http://www.tldp.org/LDP/tlk/mm/memory.html。 - user2845360
你实际的问题是什么? - CL.
http://books.msspace.net/mirrorbooks/linuxsystems/images/059600222X/figs/bels_0206.gif - MDMoore313
2个回答

13

这是部分答案,或许能帮到你。

Linux将内核虚拟地址空间分为两个部分 - lowmem和vmalloc。

Lowmem使用虚拟地址和物理地址的1-1映射。即虚拟地址X映射到物理地址X-C(其中C是某个常量,例如3GB)。这个映射是在启动时构建的,并且从不更改。

Vmalloc则使用按需动态映射。在每次分配时,会找到一堆物理页、一个虚拟地址范围,并修改页表以创建映射。

两者由虚拟地址隔开。每个部分使用不同的虚拟地址范围。Lowmem范围始终被映射,vmalloc范围在分配时被映射。


谢谢您的解释。我该如何找到Lowmem的范围?我已经设法找到了您所说的常量,它被定义为PAGE_OFFSET,即0xC0000000。 - kimi

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的内核空间被分成了887Mb的低端内存和120Mb的高端内存。你可以看到,高端内存中有120MB被vmalloc区域占用,而pkmap和fixmap区域仅保留2和3Kb。关于fixmaps的更多信息,请参阅此处:http://embeddedma.blogspot.ru/2013/06/linux-fixmap-role.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接