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

Linux 内核虚拟内存如何映射到物理内存,linux,memory-management,linux-kernel,Linux,Memory Management,Linux Kernel,如何找到内核空间的内存映射?VA->PA 我知道proc文件系统/proc/pid/maps&/proc/pid/mappings,它为我们提供了用户空间应用程序的映射。有什么类似于查找内核空间映射的吗 谢谢 这里有一个部分答案,也许会有帮助 Linux将内核虚拟地址空间分为两部分——lowmem和vmalloc Lowmem在虚拟地址和物理地址之间使用1-1映射。即,虚拟地址X映射到物理地址X-C(其中C是某个常数,例如3GB)。此映射是在引导过程中构建的,永远不会更改 Vmalloc根据需要

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

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


谢谢

这里有一个部分答案,也许会有帮助

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

Lowmem在虚拟地址和物理地址之间使用1-1映射。即,虚拟地址X映射到物理地址X-C(其中C是某个常数,例如3GB)。此映射是在引导过程中构建的,永远不会更改

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


两个由虚拟地址分隔。每个服务器使用不同的虚拟地址范围。lowmem范围始终映射,vmalloc范围在分配时映射。

实际上,内核空间分为低内存和高内存(vmalloc区域是高内存的一部分)。正如ugoren所说,lowmem是直接映射,在引导时构建。例如,可以使用高内存使用kmap(pkmap区域)映射一些用户空间页面。 下面是更详细的图片,您可以在引导时的内核日志中找到。 例如:


在本例中,1Gb内核空间分成887个低内存和120个高内存。正如您所看到的,vmalloc区域占用了120 MB的高内存,而pkmap和fixmap区域只保留了2和3 KB的内存。关于fixmaps,您可以在此处阅读。

有点过时,但仍然相关:。您的实际问题是什么?谢谢您的解释。如何找到Lowmem的范围?我会设法找到你所说的常数,它的定义是PAGE_OFFSET,它是0xc000000
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)