0xffffffff
( 4'294'967'295
) endereços lineares para acessar um local físico na memória 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 hexadecimal e dec:
0x00000000 - 0xbfffffff
0 - 3'221'225'471
O espaço do kernel (pouca memória) só pode ser acessado pelo kernel.
O intervalo de endereços em notação hexadecimal e dec:
0xc0000000 - 0xffffffff
3'221'225'472 - 4'294'967'295
Assim:
0x00000000 0xc0000000 0xffffffff
| | |
+------------------------+----------+
| User | Kernel |
| space | space |
+------------------------+----------+
Assim, o layout de memória que você viu em 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 (convertem lineares 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 de endereço mínimo é grande o suficiente para instalar o kernel na RAM e inicializar suas estruturas de dados principais.
O tamanho usado deles é mostrado dentro dos parênteses, por exemplo, o código do kernel:
0xc071ae6a - 0xc0400000 = 31AE6A
Em notação decimal, isso é 3'255'914
(3179 kB).
Em segundo lugar, 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.
Este não é o 1 GB completo, porque o kernel sempre requer pelo menos 128 MB de endereços lineares para implementar alocação de memória não-contígua e endereços lineares mapeados por 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 deste esquema é evitar a fragmentação externa, isto é usado para áreas de troca, módulos de 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 de longa duração de quadros de páginas 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)
Estes são endereços lineares fixos que podem se referir a qualquer endereço físico na RAM, não apenas os últimos 1 GB como os endereços de baixa memória. Endereços lineares de mapeamento de correção são um pouco mais eficientes do que seus colegas de baixa memória e pkmap. Existem descritores de tabela de páginas dedicados designados para mapeamento fixo, e mapeamentos de páginas HIGHMEM usando kmap_atomic são alocados a partir daqui.
Se você quiser mergulhar mais fundo na toca do coelho: Entendendo o Kernel do Linux