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

관련 정보