32ビットLinuxカーネルスペースのレイアウトは何ですか?

32ビットLinuxカーネルスペースのレイアウトは何ですか?

64ビットLinuxのカーネル空間レイアウトによると、Documentation/x86/x86_64/mm.txt次のようになります。

  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アリーナ、カーネルイメージ、および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

おすすめ記事