GNU/Linux >> Tutoriales Linux >  >> Linux

Linux:¿qué implica el diseño de la memoria del kernel virtual en Dmesg?

Mientras pasa por “Salida de dmesg” Pude ver una lista de valores que no puedo entender correctamente.

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)

De los valores entiendo que tengo 2 GB de RAM (memoria física). Pero el resto de las cosas parecen ser números mágicos para mí.

Me gustaría saber sobre cada uno (fixmap, pkmap, etc.) en breve (si hay más dudas, publicaré cada uno como una pregunta separada)?

¿Alguien podría explicarme eso?

Respuesta aceptada:

En primer lugar, un sistema de 32 bits tiene 0xffffffff (4'294'967'295 ) direcciones lineales para acceder a una ubicación física encima de la RAM.
El kernel divide estas direcciones en espacio de usuario y kernel.

El usuario puede acceder al espacio de usuario (memoria alta) y, si es necesario, también el kernel.
El rango de direcciones en notación hexadecimal y decimal:

0x00000000 - 0xbfffffff
0 - 3'221'225'471

Solo el kernel puede acceder al espacio del kernel (memoria baja).
El rango de direcciones en notación hexadecimal y decimal:

0xc0000000 - 0xffffffff
3'221'225'472 - 4'294'967'295

Así:

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

Por lo tanto, el diseño de memoria que viste en dmesg corresponde al mapeo de direcciones lineales en el espacio del kernel.

En primer lugar, las secuencias .text, .data e .init que proporcionan la inicialización de las propias tablas de páginas del kernel (traducción lineal a direcciones físicas).

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

El rango donde reside el código del kernel.

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

El rango donde residen los segmentos de datos del kernel.

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

El rango donde residen las tablas de páginas iniciales del kernel.

(y otros 128 kB para algunas estructuras de datos dinámicas).

Este espacio de direcciones mínimo es lo suficientemente grande como para instalar el kernel en la RAM e inicializar sus estructuras de datos principales.

Su tamaño utilizado se muestra entre paréntesis, por ejemplo, el código del kernel:

0xc071ae6a - 0xc0400000 = 31AE6A

En notación decimal, eso es 3'255'914 (3179 KB).

En segundo lugar, el uso del espacio del núcleo después de la inicialización

lowmem  : 0xc0000000 - 0xf77fe000   ( 887 MB)

El kernel puede usar el rango lowmem para acceder directamente a las direcciones físicas.
Este no es el 1 GB completo, porque el kernel siempre requiere al menos 128 MB de direcciones lineales para implementar la asignación de memoria no contigua y direcciones lineales mapeadas fijas .

vmalloc : 0xf7ffe000 - 0xff7fe000   ( 120 MB)

La asignación de memoria virtual puede asignar marcos de página en función de un esquema no contiguo. La principal ventaja de este esquema es evitar la fragmentación externa, esto se usa para áreas de intercambio, módulos del núcleo o asignación de búferes a algunos dispositivos de E/S.

pkmap   : 0xff800000 - 0xffa00000   (2048 kB)

El mapeo permanente del kernel permite que el kernel establezca mapeos duraderos de marcos de página de alta memoria en el espacio de direcciones del kernel. Cuando se mapea una página HIGHMEM usando kmap(), las direcciones virtuales se asignan desde aquí.

fixmap  : 0xffc57000 - 0xfffff000   (3744 kB)

Estas son direcciones lineales mapeadas fijas que pueden referirse a cualquier dirección física en la RAM, no solo al último 1 GB como las direcciones lowmem. Las direcciones lineales mapeadas fijas son un poco más eficientes que sus colegas lowmem y pkmap.
Hay descriptores de tablas de páginas dedicados asignados para el mapeo fijo, y las asignaciones de páginas HIGHMEM que usan kmap_atomic se asignan desde aquí.

Relacionado:¿Cómo eliminar todos los archivos con una extensión en particular en una carpeta en particular?

Si desea profundizar más en la madriguera del conejo:
Comprender el kernel de Linux


Linux
  1. Linux:¿qué son la memoria alta y la memoria baja en Linux?

  2. Linux:¿qué fuentes de entropía utiliza el kernel de Linux?

  3. ¿Qué hace exactamente make oldconfig en el archivo MAKE del kernel de Linux?

  4. ¿Qué significa decir que el kernel de Linux es preventivo?

  5. ¿Qué significa __init en el código del kernel de Linux?

Comando Dmesg en Linux

¿Cuál es la diferencia entre los núcleos de macOS y Linux?

¿Qué es el Shell en Linux?

¿Qué es la tabla de procesos de Linux? ¿En qué consiste?

¿Cuál es la fuente actual del kernel de Linux?

¿Qué significa el símbolo de la tubería de Linux? ¿hacer?