GNU/Linux >> Linux Esercitazione >  >> Linux

Linux:cosa implica il layout della memoria del kernel virtuale in Dmesg?

Durante l'analisi di "Output di dmesg" Potrei vedere un elenco di valori che non sono in grado di comprendere correttamente.

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)

Dai valori capisco che ho 2 GB di RAM (memoria fisica). Ma il resto delle cose sembra essere Magic Numbers per me.

Vorrei conoscere brevemente ciascuno di essi (fixmap, pkmap,.. ecc.) (in caso di ulteriori dubbi, posterò ciascuno come domanda separata)?

Qualcuno potrebbe spiegarmelo?

Risposta accettata:

Innanzitutto, un sistema a 32 bit ha 0xffffffff (4'294'967'295 ) indirizzi lineari per accedere a una posizione fisica sulla RAM.
Il kernel divide questi indirizzi in user e kernel space.

Lo spazio utente (memoria elevata) è accessibile dall'utente e, se necessario, anche dal kernel.
L'intervallo di indirizzi in notazione esadecimale e dec:

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

Lo spazio del kernel (memoria insufficiente) è accessibile solo dal kernel.
L'intervallo di indirizzi in notazione esadecimale e dec:

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

In questo modo:

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

Quindi, il layout della memoria che hai visto in dmesg corrisponde alla mappatura degli indirizzi lineari nello spazio del kernel.

Innanzitutto, le sequenze .text, .data e .init che forniscono l'inizializzazione delle tabelle delle pagine del kernel (traducono linearmente in indirizzi fisici).

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

L'intervallo in cui risiede il codice del kernel.

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

L'intervallo in cui risiedono i segmenti di dati del kernel.

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

L'intervallo in cui risiedono le tabelle delle pagine iniziali del kernel.

(e altri 128 kB per alcune strutture dati dinamiche.)

Questo spazio di indirizzi minimo è abbastanza grande per installare il kernel nella RAM e per inizializzare le sue strutture di dati principali.

La loro dimensione utilizzata è mostrata tra parentesi, prendiamo ad esempio il codice del kernel:

0xc071ae6a - 0xc0400000 = 31AE6A

In notazione decimale, è 3'255'914 (3179 kB).

In secondo luogo, l'utilizzo dello spazio del kernel dopo l'inizializzazione

lowmem  : 0xc0000000 - 0xf77fe000   ( 887 MB)

L'intervallo lowmem può essere utilizzato dal kernel per accedere direttamente agli indirizzi fisici.
Questo non è l'intero 1 GB, perché il kernel richiede sempre almeno 128 MB di indirizzi lineari per implementare l'allocazione di memoria non contigua e gli indirizzi lineari mappati per la correzione .

vmalloc : 0xf7ffe000 - 0xff7fe000   ( 120 MB)

L'allocazione della memoria virtuale può allocare frame di pagina in base a uno schema non contiguo. Il vantaggio principale di questo schema è quello di evitare la frammentazione esterna, utilizzata per aree di scambio, moduli del kernel o allocazione di buffer ad alcuni dispositivi I/O.

pkmap   : 0xff800000 - 0xffa00000   (2048 kB)

La mappatura permanente del kernel consente al kernel di stabilire mappature durature di frame di pagina con memoria elevata nello spazio degli indirizzi del kernel. Quando una pagina HIGHMEM viene mappata utilizzando kmap(), gli indirizzi virtuali vengono assegnati da qui.

fixmap  : 0xffc57000 - 0xfffff000   (3744 kB)

Si tratta di indirizzi lineari a mappatura fissa che possono fare riferimento a qualsiasi indirizzo fisico nella RAM, non solo all'ultimo 1 GB come gli indirizzi a memoria bassa. Gli indirizzi lineari con mappatura fissa sono un po' più efficienti dei loro colleghi lowmem e pkmap.
Ci sono descrittori di tabelle di pagina dedicati assegnati per la mappatura fissa e le mappature di pagine HIGHMEM che utilizzano kmap_atomic vengono allocate da qui.

Correlati:come eliminare tutti i file con una particolare estensione in una determinata cartella?

Se vuoi immergerti più a fondo nella tana del coniglio:
Capire il kernel Linux


Linux
  1. Che cos'è il kernel Linux e dovresti aggiornare al kernel più recente?

  2. Linux:quali sorgenti di entropia vengono utilizzate dal kernel Linux?

  3. Cosa fa esattamente oldconfig nel makefile del kernel di Linux?

  4. Cosa significa dire che il kernel Linux è preventivo?

  5. quali processi killer ha Linux?

Comando Dmesg in Linux

Qual ​​è la differenza tra i kernel macOS e Linux

Che cos'è la shell in Linux?

Qual è la tabella dei processi Linux? In cosa consiste?

Quanta RAM utilizza il kernel?

Cosa significa il suffisso .d in Linux?