it-swarm-pt.tech

O que implica o Layout da memória do kernel virtual no dmesg?

Ao passar pelo "Output of 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)

Pelos valores eu entendo que tenho 2 GB de RAM (memória física). Mas o resto das coisas parecem ser números mágicos para mim.

Gostaria de saber um pouco sobre cada um (fixmap, pkmap, .. etc.) (se tiver mais dúvidas, irei postar cada um como uma Questão separada)?

Alguém poderia me explicar isso?

19
Sen

Primeiro, um sistema de 32 bits tem 0xffffffff (4'294'967'295) endereços lineares para acessar um local físico no topo da RAM.
O kernel divide esses endereços em 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

Como isso:

0x00000000             0xc0000000  0xffffffff 
    |                        |          |
    +------------------------+----------+
    |  User                  |  Kernel  |
    |  space                 |  space   |
    +------------------------+----------+

Portanto, o layout de memória que você viu em dmesg corresponde ao mapeamento de endereços lineares no espaço do kernel.

Primeiro, as sequências .text, .data e .init que fornecem a inicialização das próprias tabelas de páginas do kernel (traduzem linear em endereços físicos).

.text : 0xc0400000 - 0xc071ae6a   (3179 kB)

O intervalo onde reside o código do kernel.

.data : 0xc071ae6a - 0xc08feb78   (1935 kB)

O intervalo onde residem os segmentos de dados do kernel.

.init : 0xc0906000 - 0xc0973000   ( 436 kB)

O intervalo onde residem as tabelas da página inicial do kernel.

(e outros 128 kB para algumas estruturas de dados dinâmicas.)

Este espaço de endereço mínimo é grande o suficiente para instalar o kernel no RAM e para inicializar suas estruturas de dados centrais.

O tamanho usado é mostrado entre parênteses, tome por exemplo o código do kernel:

0xc071ae6a - 0xc0400000 = 31AE6A

Em notação decimal, é 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 os 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, isso é usado para áreas de swap, módulos do kernel ou alocação de buffers para alguns dispositivos de E/S.

pkmap   : 0xff800000 - 0xffa00000   (2048 kB)

O mapeamento de kernel permanente permite que o kernel estabeleça mapeamentos de longa duração 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 por correção que podem se referir a qualquer endereço físico na RAM, não apenas o último 1 GB, como os endereços de baixa memória. Endereços lineares com mapeamento fixo são um pouco mais eficientes do que seus colegas lowmem e pkmap. Existem descritores de tabela de página dedicados atribuídos 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:
Compreendendo o kernel do Linux

22
wag