首页 文章

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

提问于
浏览
11

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

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

谢谢!

2 回答

  • 11

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

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

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

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

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

  • 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内核空间分为887低mem和120高mem . 正如您可以看到vmalloc区域占用120 MB的高内存,而pkmap和fixmap区域仅保留2和3 Kbs . 关于修复映射,你可以在这里阅读http://embeddedma.blogspot.ru/2013/06/linux-fixmap-role.html .

相关问题