2012-06-28 8 views
5

Lo spazio di indirizzi virtuali dell'utente per x86-64 con Linux è lungo 47 bit. Il che significa essenzialmente che Linux può mappare un processo con circa 128 TB di intervallo di indirizzi virtuali.In che modo Linux supporta oltre 512 GB di intervallo di indirizzi virtuali in x86-64?

Tuttavia, ciò che mi confonde è che l'architettura x86-64 supporta la tabella di pagina gerarchica a 4 livelli definita ISA (organizzata come albero radix) per ogni processo. La radice della tabella di pagine può solo mappare fino a 512 GB di spazio di indirizzamento virtuale contiguo. Quindi, come Linux può supportare più di 512 GB di gamma di indirizzi virtuali? Utilizza più tabelle di pagina per ogni processo? Se sì, allora per un processo cosa dovrebbe contenere il CR3 (il registro x86-64 per contenere l'indirizzo della base della tabella della pagina) per ogni dato processo? Mi sto perdendo qualcosa?

risposta

7

La radice della tabella di pagine può solo mappare fino a 512 GB di spazio di indirizzamento virtuale contiguo. Quindi, come Linux può supportare più di 512 GB di gamma di indirizzi virtuali? Utilizza più tabelle di pagina per ogni processo? Se sì, allora per un processo cosa dovrebbe contenere il CR3 (il registro x86-64 per contenere l'indirizzo della base della tabella della pagina) per ogni dato processo? Mi sto perdendo qualcosa?

Non so che cosa si intende per "radice della tabella di pagina", ma di paging su x86-64 si presenta così:

  • tabelle della pagina - il livello più basso delle strutture di paging. Ognuno ha 512 voci a 8 byte (PTE) che descrivono una pagina 4 KiB, quindi PT descrive 512 * 4 KiB = 2 MiB di memoria (può funzionare anche come 2 pagine MiB, ma lasciamo per ora).
  • Directory di pagina - tabella, simile a PT, contenente 512 voci a 8 byte (PDE) che puntano a PT; quindi, PD descrive 512 * 2 MiB = 1 GiB di memoria (può funzionare anche come 1 pagina GiB, similare a PT).
  • Tabella pagine di pagine di pagine - simile a PD, ma contiene 512 voci a 8 byte (PDPTE) che puntano a PD; così, PDPTE descrive 512 * 1 Gib = 512 GiB di memoria.
  • PML4, il livello più alto delle strutture di paginazione, è una tabella contenente 512 voci a 8 byte (PML4E) che puntano a PDPT; quindi, PML4 descrive 512 * 512 GiB = 256 TiB di memoria.

Non so precisa mappa di memoria di Linux, ma probabilmente il mezzo più elevato (da -128 a 0 TiB - da 0xFFFF800000000000 a 0xFFFFFFFFFFFFFFFF) è riservato per il kernel, metà inferiore (0-128 TiB - da 0x0000000000000000 a 0x00007FFFFFFFFFFF) è per le applicazioni dello spazio utente. Quindi, Linux supporta 512 volte il 512 GiB dell'intervallo di indirizzi virtuali che stai chiedendo; persino Torvalds non direbbe "non appoggeremo PML4". Non so cosa ti confonda - è il fatto che ti sei perso la parte dicendo che la tabella di pagina mappa 2 MiB e l'hai presa mentre mappa una pagina - 4 KiB - ma se c'è qualcosa che potrei chiarire, chiedi informazioni su esso.

+0

Grazie per il chiarimento.Ho sbagliato un livello e quindi la confusione. Adesso è chiaro. – Arka

0

In genere gli spazi degli indirizzi di processo non sono condivisi, il che significa che le tabelle delle pagine coinvolte non sono condivise tra processi distinti. E ciò significa a tutti e 4 i livelli del tavolo.

Ovviamente, la parte comune (kernel) è sempre presente in tutti gli spazi di indirizzamento, quindi, in effetti, c'è una condivisione, ma la memoria è accessibile solo al kernel stesso.

Oltre a questo, infatti, ogni processo ha le proprie tabelle di pagina praticamente e non vi è alcun problema con l'utilizzo di tutti gli indirizzi 2 in uno di essi. Almeno, non c'è alcuna limitazione speciale sulla parte della CPU, sebbene ci possa essere una parte del sistema operativo.