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로 구성됩니다. 이는 소위 물리적 메모리로부터 선형적으로 매핑됩니다.pkmap
vmalloc
vmalloc
lowmem
물리적 다이어그램이 지역을 가리킵니다. 내부의 .init
, .data
은 커널 이미지에 속하며 64비트 Linux에서는 독립적인 영역입니다..text
lowmem