Cosa implica il layout di memoria del kernel virtuale in dmesg?


19

Durante la "Output di dmesg" ho potuto 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 numeri magici per me.

Vorrei sapere brevemente ciascuno di essi (fixmap, pkmap, ecc.) (In caso di dubbi, li posterò come una domanda separata)?

Qualcuno potrebbe spiegarmelo?

Risposte:


22

Prima di tutto, un sistema a 32 bit ha 0xffffffff( 4'294'967'295) indirizzi lineari per accedere a una posizione fisica in cima alla RAM.
Il kernel divide questi indirizzi nello spazio utente e kernel.

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

Come questo:

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

Pertanto, il layout di memoria che hai visto dmesgcorrisponde alla mappatura degli indirizzi lineari nello spazio del kernel.

In primo luogo, le sequenze .text, .data e .init che forniscono l'inizializzazione delle tabelle di pagine del kernel (traducono lineare 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 di dati dinamici.)

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

Le dimensioni utilizzate sono mostrate tra parentesi, ad esempio il codice del kernel:

0xc071ae6a - 0xc0400000 = 31AE6A

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


In secondo luogo, l'uso 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.
Non si tratta dell'intero 1 GB, poiché il kernel richiede sempre almeno 128 MB di indirizzi lineari per implementare l'allocazione di memoria non contigua e indirizzi lineari con mappatura fissa.

vmalloc : 0xf7ffe000 - 0xff7fe000   ( 120 MB)

L'allocazione di memoria virtuale può allocare frame di pagina in base a uno schema non contiguo. Il vantaggio principale di questo schema è 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 di lunga durata di frame di pagine ad alta memoria 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 con mappatura fissa che possono fare riferimento a qualsiasi indirizzo fisico nella RAM, non solo agli ultimi 1 GB come gli indirizzi lowmem. Gli indirizzi lineari con mappatura fissa sono un po 'più efficienti dei loro colleghi lowmem e pkmap. Esistono descrittori di tabelle di pagine dedicate assegnati per il mapping fisso e i mapping delle pagine HIGHMEM che utilizzano kmap_atomic sono allocati da qui.


Se vuoi immergerti più in profondità nella tana del coniglio:
Comprendere il kernel Linux


Grazie per questa ottima risposta. Vorrei sapere perché il mem basso non è pieno 1 GB e altro sulla parte successiva della frase "perché il kernel richiede sempre almeno 128 MB di indirizzi lineari per implementare l'allocazione di memoria non contigua e indirizzi lineari con mappatura fissa".
Sen,

Il kernel deve accedere di tanto in tanto al codice ad alta memoria (fe informazioni BIOS e ACPI risiedono sui primi MB della RAM), non può farlo direttamente (come l'area a basso costo), quindi deve mappare memoria bassa a indirizzi lineari ad alta memoria, i 128 MB sono riservati solo a questo scopo. L'area vmalloc è per lo più temporaneamente mappata su alcune aree ad alta memoria e viene rimappata abbastanza velocemente.
wag,

Quindi anche le pagine impostate dal kernel per le chiamate al sistema virtuale fanno parte di fixmap ??? Ho incontrato questa domanda perché voglio sapere cosa si trova esattamente nella pagina con l'indirizzo fffb5000, fffa1000 ecc ... Sto ottenendo un sovraccarico nel mio replay dei record della macchina virtuale perché molte CPU virtuali accedono a questa pagina MOLTO .... come fare So esattamente cosa c'è in questo indirizzo ... GRANDE RISPOSTA a proposito :)
Deep Thought
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.