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 地址在哪裡、核心程式碼和核心模組在哪裡等細節。它們到底是什麼樣的?
謝謝你的幫助:)
好吧,現在我想我可以給自己一個答案了:)
總之,在 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 組成。它是從物理記憶體線性映射的,所謂的physmap就是指這個區域。裡面的, ,屬於核心鏡像,在 64 位 linux 中是一個單獨的區域。pkmap``vmalloc``vmalloc``lowmem``.init``.data``.text``lowmem