Linux

32位linux核心空間的佈局是怎樣的?

  • December 10, 2016

根據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

引用自:https://unix.stackexchange.com/questions/328146