2013-12-09 128 views
10

如何找出内核空间的内存映射? VA - > PA内核虚拟内存如何映射到物理内存

我知道了proc文件系统/proc/pid/maps & /proc/pid/mappings这让我们的用户空间应用的映射。类似于查找内核空间映射的内容?

谢谢!

+0

有点过时,但仍然相关:http://www.tldp.org/LDP/tlk/mm/memory.html。 –

+0

你的实际问题是什么? –

+0

http://books.msspace.net/mirrorbooks/linuxsystems/images/059600222X/figs/bels_0206.gif – MDMoore313

回答

11

下面是部分答案,也许会有所帮助。

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

Lowmem在虚拟地址和物理地址之间使用1-1映射。即虚拟地址X被映射到物理地址X-C(其中C是某个常数,例如3GB)。这个映射是在启动时建立的,并且永远不会改变。

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

两个虚拟地址分隔。各自使用不同的虚拟地址范围。 lowmem范围始终映射,vmalloc范围在分配时映射。

+0

感谢您的解释。我如何找到Lowmem的范围?我设法找到你正在谈论的常量,它被定义为0xC0000000的PAGE_OFFSET – kimi

2

实际上,kernelspace分为低和高内存(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) 

在分为887对120高MEM低MEM这个例子中1Gb的内核空间。正如您可以看到vmalloc区域占用120 MB大容量内存,并且仅为pkmap和fixmap区域保留2 Kbs和3 Kbs。关于fixmaps,你可以在这里阅读http://embeddedma.blogspot.ru/2013/06/linux-fixmap-role.html