Primeiro, um sistema de 32 bits possui 0xffffffff
( 4'294'967'295
) endereços lineares para acessar um local físico no topo da RAM.
O kernel divide esses endereços no espaço do usuário e do kernel.
O espaço do usuário (memória alta) pode ser acessado pelo usuário e, se necessário, também pelo kernel.
O intervalo de endereços em notação hex e dec:
0x00000000 - 0xbfffffff
0 - 3'221'225'471
O espaço do kernel (pouca memória) pode ser acessado apenas pelo kernel.
O intervalo de endereços em notação hex e dec:
0xc0000000 - 0xffffffff
3'221'225'472 - 4'294'967'295
Como isso:
0x00000000 0xc0000000 0xffffffff
| | |
+------------------------+----------+
| User | Kernel |
| space | space |
+------------------------+----------+
Assim, o layout da memória que você viu dmesg
corresponde ao mapeamento de endereços lineares no espaço do kernel.
Primeiro, as seqüências .text, .data e .init que fornecem a inicialização das próprias tabelas de páginas do kernel (traduzem linearmente em endereços físicos).
.text : 0xc0400000 - 0xc071ae6a (3179 kB)
O intervalo em que o código do kernel reside.
.data : 0xc071ae6a - 0xc08feb78 (1935 kB)
O intervalo em que os segmentos de dados do kernel residem.
.init : 0xc0906000 - 0xc0973000 ( 436 kB)
O intervalo em que residem as tabelas de páginas iniciais do kernel.
(e outros 128 kB para algumas estruturas de dados dinâmicas.)
Esse espaço mínimo de endereço é grande o suficiente para instalar o kernel na RAM e inicializar suas estruturas de dados principais.
Seu tamanho usado é mostrado entre parênteses, por exemplo, o código do kernel:
0xc071ae6a - 0xc0400000 = 31AE6A
Em notação decimal, isso é 3'255'914
(3179 kB).
Segundo, o uso do espaço do kernel após a inicialização
lowmem : 0xc0000000 - 0xf77fe000 ( 887 MB)
O intervalo lowmem pode ser usado pelo kernel para acessar diretamente endereços físicos.
Esse não é o total de 1 GB, porque o kernel sempre exige pelo menos 128 MB de endereços lineares para implementar alocação de memória não contígua e endereços lineares mapeados para correção.
vmalloc : 0xf7ffe000 - 0xff7fe000 ( 120 MB)
A alocação de memória virtual pode alocar quadros de página com base em um esquema não contíguo. A principal vantagem desse esquema é evitar a fragmentação externa, usada para áreas de troca, módulos do kernel ou alocação de buffers para alguns dispositivos de E / S.
pkmap : 0xff800000 - 0xffa00000 (2048 kB)
O mapeamento permanente do kernel permite que o kernel estabeleça mapeamentos duradouros de quadros de página de alta memória no espaço de endereço do kernel. Quando uma página HIGHMEM é mapeada usando kmap (), os endereços virtuais são atribuídos a partir daqui.
fixmap : 0xffc57000 - 0xfffff000 (3744 kB)
Esses são endereços lineares mapeados para correção que podem se referir a qualquer endereço físico na RAM, e não apenas aos últimos 1 GB, como os endereços lowmem. Os endereços lineares com mapeamento de correção são um pouco mais eficientes do que seus colegas lowmem e pkmap. Existem descritores de tabela de páginas dedicados designados para mapeamento fixo, e os mapeamentos de páginas HIGHMEM usando kmap_atomic são alocados a partir daqui.
Se você quiser mergulhar mais fundo na toca do coelho:
Noções básicas sobre o kernel do Linux