繁体   English   中英

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

[英]How is kernel virtual memory mapped to physical memory

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

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

谢谢!

这是一个部分答案,也许会有所帮助。

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

Lowmem使用虚拟和物理地址之间的1-1映射。 即,虚拟地址X被映射到物理地址XC(其中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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM