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 dmesg
corrisponde 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