2009-02-23 18 views
6

Nel kernel linux, mem_map è l'array che contiene tutti i descrittori di "struct page". Queste pagine includono la memoria da 128MiB in lowmem per la mappatura dinamica di highmem.perché abbiamo bisogno di zone_highmem su x86?

Poiché la dimensione del file di memoria è 1GiB, quindi l'array mem_map ha solo voci 1GiB/4KiB = 256KiB. Se ciascuna dimensione della voce è 32 byte, la dimensione della memoria mem_map = 8MiB. Ma se potessimo usare mem_map per mappare tutta la memoria fisica 4GiB (se abbiamo così tanta memoria fisica disponibile su x86-32), allora l'array mem_map occuperebbe 32MiB, che non è un sacco di memoria del kernel (o sbaglio?) .

Quindi la mia domanda è: perché abbiamo bisogno di usare quel 128MiB in basso per la mappatura indiretta di highmem in primo luogo? In altre parole, perché non mappare direttamente tutte quelle massime memorie fisiche 4GiB (se disponibili) nello spazio del kernel?

Nota: se la mia comprensione della fonte del kernel sopra è errata, si prega di correggere. Grazie!

risposta

1

un'occhiata qui: http://www.xml.com/ldd/chapter/book/ch13.html

kernel di memoria insufficiente è la 'vera' mappa di memoria, affrontato con puntatori a 32 bit su x86.

La memoria alta del kernel è la mappa di memoria "virtuale", indirizzata con strutture virtuali su x86.

Non si desidera mappare tutto nello spazio degli indirizzi del kernel, perché non è sempre possibile risolverlo e la maggior parte della memoria è necessaria per i segmenti di memoria virtuale (spazio del processo virtuale, mappato a pagina.)

Almeno, è così che l'ho letto. Wow, questa è una domanda complicata che hai chiesto.

di gettare più confusione, il capitolo 13 parla di alcuni dispositivi PCI non essere in grado di affrontare lo spazio a 32 bit, che è stata la genesi del mio precedente commento:

su x86, un po 'di utilizzo della memoria del kernel è limitato a il primo Gigabyte di memoria a causa delle preoccupazioni di DMA. Non conosco al 100% l'argomento, ma c'è una modalità di compatibilità per DMA sul bus PCI. Questo potrebbe essere ciò che stai guardando.

0

3.6 GB non è il soffitto quando si utilizza l'estensione di indirizzo fisico, che è comunemente necessaria sulla maggior parte delle schede x86 moderne, specialmente con la memoria hotplug.

0

O in altre parole, perché non di mappare tutti coloro max 4GiB fisica memoria (se disponibile) nello spazio del kernel direttamente?

Una ragione è lo spazio utente: ogni processo di spazio utilizza il proprio spazio di indirizzi virtuali. Supponiamo di avere 4 GB di RAM su x86. Quindi se suggeriamo che il kernel possiede 1 Gb di memoria (~ 800 direttamente mappato + ~ 200 vmalloc) tutti gli altri ~ 3Gb dovrebbero essere dinamicamente distribuiti tra i processi che girano nello spazio utente. Quindi, come puoi mappare i tuoi 4Gbs direttamente quando hai diversi spazi di indirizzi?

perché abbiamo bisogno di zone_highmem su x86?

Il motivo è lo stesso. Il kernel riserva solo ~ 800Mb per mem basso. Tutta l'altra memoria verrà allocata e connessa con un particolare indirizzo virtuale solo su richiesta.Ad esempio se si esegue un binario verrà creato un nuovo spazio di indirizzamento virtuale e verranno allocate alcune pagine per l'archiviazione del codice binario e dei dati (heap, stack ...). Quindi l'attributo chiave di mem alta è di servire richieste di allocazione dinamica della memoria, non si sa mai in anticipo cosa verrà attivato dallo spazio utente ...

Problemi correlati