2009-11-01 12 views
9

Mi manca qualcosa quando si tratta di comprendere la necessità di highmem per gestire più di 1 GB di RAM. Qualcuno potrebbe indicare dove sbaglio? Grazie!Indirizzo virtuale Linux 3/1 diviso

quello che so:

  • 1 GB di memoria virtuale di un processo (regione di memoria alta) è riservato per le operazioni del kernel. Lo spazio utente può utilizzare i restanti 3 GB. Questa è la divisione 3/1.

  • Le funzioni di memoria virtuale della VM mappano le pagine di memoria virtuale (continua) a pagine fisiche (RAM).

Quello che non so:

  • Quali operazioni utilizzano la memoria virtuale del kernel? Suppongo che cose come kmalloc (...) nello spazio del kernel usino la memoria virtuale del kernel.

  • Penso che 4 GB di RAM potrebbero essere utilizzati con questo schema. Non capisco perché il kernel 1 GB di spazio virtuale è il fattore limitante quando si affronta lo spazio fisico. È qui che la mia comprensione si rompe. Si prega di avvisare.

Ho letto questo (http://kerneltrap.org/node/2450), che è fantastico. Ma non affronta la mia domanda a mio piacimento.

+0

"Con 32 bit, è possibile indirizzare 4 GB di memoria, Linux su sistemi a 32 bit è stato, fino a poco tempo fa, limitato a una quantità di memoria sostanzialmente inferiore a quella, a causa del modo in cui imposta l'indirizzo virtuale spazio." -dal LDD, capitolo 13 Suppongo che la mia domanda sia, perché è limitata a una quantità di memoria notevolmente inferiore. – David

risposta

9

La ragione per cui lo spazio virtuale del kernel è un fattore limitante sulla memoria fisica utilizzabile è perché il kernel ha bisogno di accedere a tutta la memoria fisica e il modo in cui accede alla memoria fisica è attraverso gli indirizzi virtuali del kernel. Il kernel non usa istruzioni speciali che consentono l'accesso diretto alle posizioni di memoria fisica - deve impostare le voci della tabella di pagine per qualsiasi intervallo fisico con cui vuole parlare.

Nello schema "vecchio stile", le cose set kernel in modo che le tabelle delle pagine di ogni processo mappati indirizzi virtuali 0xC0000000-0xFFFFFFFF direttamente agli indirizzi fisici da 0x00000000 a 0x3FFFFFFF (queste pagine sono state segnate in modo che fossero accessibili solo in anello 0 - modalità kernel). Questi sono gli "indirizzi virtuali del kernel". Sotto questo schema, il kernel poteva direttamente leggere e scrivere qualsiasi posizione di memoria fisica senza dover interferire con la MMU per modificare i mapping.

Nell'ambito dello schema HIGHMEM, i mapping dagli indirizzi virtuali del kernel agli indirizzi fisici non sono corretti - le parti della memoria fisica sono mappate dentro e fuori lo spazio degli indirizzi virtuali del kernel, poiché il kernel ha bisogno di accedere a tale memoria. Ciò consente di utilizzare più memoria fisica, ma al costo di dover modificare costantemente le mappature da virtuale a fisico, operazione piuttosto costosa.

+0

Quindi sotto il "vecchio schema", qualsiasi processo in modalità kernel potrebbe indirizzare tutta la memoria fisica (inclusa la memoria non associata a quel particolare processo)? – David

+3

Sì, assolutamente (e possono ancora farlo - devono solo saltare attraverso i cerchi per farlo a volte). Questo è necessario - ad esempio, gli interrupt sono serviti nel contesto del processo in esecuzione al momento dell'interruzione. Il kernel è un po 'come una grande libreria condivisa, tranne per il fatto che il suo codice gira a un livello di privilegio elevato (e non puoi chiamarlo semplicemente - devi passare attraverso un punto di accesso speciale che aumenta il livello dei privilegi). – caf

+0

Quindi, quando eseguo un kmalloc (...) sotto il "vecchio schema", alloca la memoria virtuale del kernel, che si traduce veramente in memoria fisica - che non verrà mai scambiata su disco? – David

-2
  1. Ad esempio, le chiamate di sistema utilizzano lo spazio del kernel.
  2. È possibile avere 64 GB di RAM fisica, ma su piattaforme a 32 bit i processori possono accedere solo a 4 GB a causa dell'indirizzamento virtuale a 32 bit. In realtà, puoi avere 1 GB di RAM e 3 GB di swap e l'indirizzamento virtuale farà sembrare che tu abbia 4 GB. Sulle piattaforme a 64 bit l'indirizzamento virtuale è praticamente illimitato.
+0

Anacrolix: cosa? – Alexandru

+0

1 GB di RAM e 3 GB di scambio? Non ha alcun senso ... su una macchina a 32 bit non è necessario avere lo swap del tutto per raggiungere il limite di indirizzamento della propria architettura. –

+0

Sono stato un esempio. – Alexandru

4

Associare 1 GB al kernel in ogni processo consente ai processi di passare alla modalità kernel senza eseguire anche un interruttore di contesto. Le risposte alle chiamate di sistema come read(), mmap() e altre possono essere elaborate in modo appropriato nello spazio degli indirizzi del processo chiamante.

Se lo spazio per il kernel non era riservato in ogni processo, passare alla "modalità kernel" tra l'esecuzione del codice dello spazio utente sarebbe più costoso e non essere in grado di utilizzare la mappatura dell'indirizzo virtuale attraverso l'MMU hardware (unità di gestione della memoria) per le chiamate di sistema in manutenzione.

I sistemi che eseguono un kernel a 32 bit con più di 1 GB di memoria fisica, sono in grado di assegnare posizioni di memoria fisica in ZONE_HIGHMEM (all'incirca al di sopra del segno da 1 GB), che può richiedere al kernel di saltare attraverso i cerchi per alcune operazioni per interagire con loro . L'aggiunta di PAE (estensione dell'indirizzo fisico) estende questo problema consentendo fino a 64 GB di memoria fisica, riducendo il rapporto della memoria all'interno della memoria dell'indirizzo fisico da 1 GB, alle aree allocate in ZONE_HIGHMEM.

+0

Sì, i motivi per avere la memoria virtuale del kernel sono chiari. Ma nei giorni pre-HIGHMEM, perché la memoria virtuale del kernel occupa il fattore limitante nell'indirizzamento della memoria fisica? – David