如何找出内核空间的内存映射? VA - > PA内核虚拟内存如何映射到物理内存
我知道了proc
文件系统/proc/pid/maps
& /proc/pid/mappings
这让我们的用户空间应用的映射。类似于查找内核空间映射的内容?
谢谢!
如何找出内核空间的内存映射? VA - > PA内核虚拟内存如何映射到物理内存
我知道了proc
文件系统/proc/pid/maps
& /proc/pid/mappings
这让我们的用户空间应用的映射。类似于查找内核空间映射的内容?
谢谢!
下面是部分答案,也许会有所帮助。
Linux将内核虚拟地址空间分为两部分 - lowmem和vmalloc。
Lowmem在虚拟地址和物理地址之间使用1-1映射。即虚拟地址X被映射到物理地址X-C(其中C是某个常数,例如3GB)。这个映射是在启动时建立的,并且永远不会改变。
Vmalloc根据需要使用动态映射。在每次分配时,都会找到一堆物理页面和一个虚拟地址范围,并修改分页表以创建映射。
两个虚拟地址分隔。各自使用不同的虚拟地址范围。 lowmem范围始终映射,vmalloc范围在分配时映射。
感谢您的解释。我如何找到Lowmem的范围?我设法找到你正在谈论的常量,它被定义为0xC0000000的PAGE_OFFSET – kimi
实际上,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。
有点过时,但仍然相关:http://www.tldp.org/LDP/tlk/mm/memory.html。 –
你的实际问题是什么? –
http://books.msspace.net/mirrorbooks/linuxsystems/images/059600222X/figs/bels_0206.gif – MDMoore313