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 fixmap
, pkmap
, 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.