O que significa o layout de memória do kernel virtual no dmesg?

19

Ao passar pela "Saída do dmesg" , pude ver uma lista de valores que não consigo entender corretamente.

Memory: 2047804k/2086248k available (3179k kernel code, 37232k reserved, 1935k data, 436k init, 1176944k highmem)
virtual kernel memory layout:
    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)

Dos valores eu entendo que eu tenho 2GB de RAM (memória física). Mas o resto das coisas parece ser Números Mágicos para mim.

Eu gostaria de saber sobre cada um deles (fixmap, pkmap, .. etc.) em breve (se houver mais dúvidas, vou postar cada um deles como uma questão separada)?

Alguém poderia explicar isso para mim?

    
por Sen 24.12.2010 / 07:03

1 resposta

22
Primeiro, um sistema de 32 bits possui 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

    
por 25.12.2010 / 01:39