による 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アドレスの場所、カーネルコードやカーネルモジュールの場所などの詳細を教えてくれません。正確にはどのようなものですか?
助けてくれてありがとう:)
さて、今私は自分自身に答えを与えることができると思います:)
つまり、32ビットLinuxでは、限られたカーネル仮想アドレス空間(モジュールとvmallocアリーナ、カーネルイメージと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
、pkmap
、vmalloc
の領域が含まれます(カーネルモジュールはvmalloc
領域を使用します)。 lowmem
領域は、ZONE_DMAとZONE_NORMALで構成されます。これは物理メモリから線形にマッピングされ、いわゆるphysmapは正確にこの領域を参照します。 .init
、.data
、.text
lowmem
の内部は、64ビットLinuxの別の領域であるカーネルイメージに属しています。