32位linux内核空间的布局是怎样的?

32位linux内核空间的布局是怎样的?

根据Documentation/x86/x86_64/mm.txt,64位linux下内核空间的布局应该是这样的:

  6 0000000000000000 - 00007fffffffffff (=47 bits) user space, different per mm
  7 hole caused by [48:63] sign extension
  8 ffff800000000000 - ffff80ffffffffff (=40 bits) guard hole
  9 ffff880000000000 - ffffc7ffffffffff (=64 TB) direct mapping of all phys. memory
 10 ffffc80000000000 - ffffc8ffffffffff (=40 bits) hole
 11 ffffc90000000000 - ffffe8ffffffffff (=45 bits) vmalloc/ioremap space
 12 ffffe90000000000 - ffffe9ffffffffff (=40 bits) hole
 13 ffffea0000000000 - ffffeaffffffffff (=40 bits) virtual memory map (1TB)
 14 ... unused hole ...
 15 ffffffff80000000 - ffffffffa0000000 (=512 MB)  kernel text mapping, from phys 0
 16 ffffffffa0000000 - fffffffffff00000 (=1536 MB) module mapping space

但是32位linux中的内核空间布局是怎样的呢?我能找到的描述都是关于ZONE_DMA、ZONE_NORMAL、ZONE_HIGHMEM的,但是这些并没有告诉我诸如physmap地址在哪里,或者内核代码和内核模块在哪里等细节。它们到底是什么样的?

谢谢你的帮助:)

答案1

好吧,现在我想我可以给自己一个答案了:)

总之,在32位linux中,一些内核区域会发生冲突,以防止浪费有限的内核虚拟地址空间(例如,模块和vmalloc arena、内核映像和physmap),因此内核空间的布局可能并不那么清晰64 位。

x86 上的 32 位 linux 中内核空间的布局应该是这样的(与 AArch32 有一些区别:http://www.arm.linux.org.uk/developer/memory.txt):

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)

根据32位linux中ZONE的定义, ZONE_HIGHMEM包括fixmap,,区域(内核模块会使用区域)。该区域由ZONE_DMA和ZONE_NORMAL组成。它是从物理内存线性映射的,即所谓的pkmapvmallocvmalloclowmem物理图正是指这个地区。里面的.init, .data,属于内核镜像,在64位linux中是一个独立的区域。.textlowmem

相关内容