Qual é o layout do espaço do kernel no 32bit linux?

4

De acordo com Documentation/x86/x86_64/mm.txt , o layout do espaço do kernel deve ser assim em 64bit 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

Mas como é o layout do espaço do kernel no linux de 32 bits? A descrição que eu posso encontrar é sobre ZONE_DMA, ZONE_NORMAL, ZONE_HIGHMEM, mas isso não me diz detalhes como onde está o endereço do mapa físico, ou onde está o código do kernel e módulos do kernel, etc. Como exatamente eles são?

Obrigado por qualquer ajuda :)

    
por Arvin Hsu 05.12.2016 / 15:14

1 resposta

1

Bem, agora acho que posso me dar uma resposta:)

Em uma palavra, no linux de 32 bits, algumas regiões do kernel colidem para evitar desperdício de espaço limitado de endereço virtual do kernel (por exemplo, módulos e vmalloc arena, imagem do kernel e physmap) para que o layout do espaço do kernel não seja tão claro como é em 64 bits.

O layout do espaço do kernel no linux de 32 bits no x86 deve ser assim (algumas diferenças de AArch32: link :

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)

De acordo com a definição de ZONE no linux de 32 bits, ZONE_HIGHMEM inclui a região de fixmappkmap , vmalloc (os módulos do kernel usarão vmalloc region). A área lowmem consiste em ZONE_DMA e ZONE_NORMAL. Ele é mapeado linearmente a partir da memória física e o chamado physmap se refere exatamente a essa região. O .init , .data , .text dentro de lowmem pertence à imagem do kernel, que é uma área separada no linux de 64 bits.

    
por 10.12.2016 / 11:33