Perché Debian Linux consente fino a 128 TB di spazio di indirizzi virtuali per processo ma solo 64 TB di memoria fisica?


23

Ho appena letto qui :

  • fino a 128 TB di spazio di indirizzi virtuali per processo (anziché 2GiB)
  • Supporto della memoria fisica da 64 TB invece di 4GiB (o 64GiB con estensione PAE)

Perché? Voglio dire, il supporto di memoria fisica è limitato dal kernel o dall'hardware corrente?

Perché avresti bisogno del doppio dello spazio di memoria virtuale rispetto alla memoria fisica che puoi effettivamente indirizzare?


Puoi anche aggiungere lo scambio.
Thorbjørn Ravn Andersen,

2
è molta RAM ...
dalearn,

4
@dalearn - sai, quando ho appreso per la prima volta che potresti ottenere l'espansione della memoria a commutazione di banco per i micro a 8 bit che consentono loro di avere fino a 4096 KB, ho detto esattamente la stessa cosa ...
Jules,

Risposte:


35

Questi limiti non provengono da Debian o da Linux, ma provengono dall'hardware. Architetture diverse (processore e bus di memoria) hanno limitazioni diverse.

Sugli attuali processori PC x86-64, la MMU consente 48 bit di spazio di indirizzi virtuali . Ciò significa che lo spazio degli indirizzi è limitato a 256 TB. Con un bit per distinguere gli indirizzi del kernel dagli indirizzi degli utenti, ciò lascia 128 TB per lo spazio degli indirizzi di un processo.

Sugli attuali processori x86-64, gli indirizzi fisici possono utilizzare fino a 48 bit , il che significa che è possibile avere fino a 256 TB. Il limite è aumentato progressivamente da quando è stata introdotta l'architettura amd64 (da 40 bit se ricordo bene). Ogni bit di spazio degli indirizzi costa un po 'di logica di cablaggio e decodifica (che rende il processore più costoso, più lento e più caldo), quindi i produttori di hardware hanno un incentivo a mantenere le dimensioni ridotte.

Linux consente solo agli indirizzi fisici di salire fino a 2 ^ 46 (quindi è possibile avere solo fino a 64 TB) perché consente di mappare interamente la memoria fisica nello spazio del kernel. Ricorda che ci sono 48 bit di spazio degli indirizzi; un bit per kernel / utente lascia 47 bit per lo spazio degli indirizzi del kernel. Metà di questo al massimo indirizza direttamente la memoria fisica e l'altra metà consente al kernel di mappare tutto ciò di cui ha bisogno. (Linux può far fronte a memoria fisica che non può essere mappata per intero allo stesso tempo, ma ciò introduce ulteriore complessità, quindi viene eseguita solo su piattaforme dove è richiesto, come x86-32 con PAE e armv7 con LPAE.)

È utile che la memoria virtuale sia più grande della memoria fisica per diversi motivi:

  • Permette al kernel di mappare l'intera memoria fisica e di lasciare spazio per i mapping virtuali.
  • Oltre alle mappature della memoria fisica, ci sono mappature di swap, di file e di driver di dispositivo.
  • È utile disporre di memoria non mappata in alcuni punti: pagine di guardia per catturare overflow del buffer , grandi zone non mappate dovute ad ASLR , ecc.

9
La limitazione a 46 bit sulla memoria fisica è correlata alla mappa di memoria di Linux : include una mappatura completa della memoria fisica nello spazio del kernel, il che significa che la memoria fisica può corrispondere solo a un quarto dello spazio degli indirizzi disponibile.
Stephen Kitt,

Qualcuno potrebbe elaborare il commento di @StephenKitt? Sono molto interessato a capire che, ma anche dopo aver letto il riferimento che ha citato, non capisco;)
gsi-frank

@ gsi-frank È conveniente per il kernel mappare l'intera memoria fisica in modo permanente. Quindi in uno spazio di indirizzi 2 ^ 48, 2 ^ 47 va agli indirizzi dell'utente, 2 ^ 46 va agli indirizzi del kernel e 2 ^ 46 è per l'indirizzamento della memoria fisica.
Gilles 'SO- smetti di essere malvagio' il

@ gsi-frank Se riesci a procurarti una copia del libro classico " Sviluppare il tuo sistema operativo a 32 bit ", si approfondisce in modo sostanziale il motivo per cui l'autore ha preso una decisione simile per il proprio sistema operativo (in quel caso, la divisione dello spazio degli indirizzi virtuali di 4GiB dell'80386 in un segmento del kernel 2GiB che contiene una mappatura RAM fisica 1GiB e un segmento utente 2GiB). Chiunque sia interessato agli interni del sistema operativo dovrebbe probabilmente leggerlo - fornisce una progettazione completa di un abbastanza semplice da capire ma abbastanza avanzato da essere utile kernel del sistema operativo.
Jules,

Dalla versione 4.13 del kernel, x86-64 (e alcune altre architetture) possono essere compilati con pagetable a cinque livelli , che aumentano lo spazio degli indirizzi su x86-64 a 52 bit per RAM fisica e 57 bit per virtuale (4 PiB / 128 PiB). Si noti che la mappa di memoria nello spazio del kernel introduce problemi di sicurezza, quindi è suscettibile di modifiche nel prossimo futuro.
Stephen Kitt,

9

Non so perché, ma posso pensare a sette motivi per cui sarebbe utile supportare il doppio dello spazio di indirizzi rispetto alla memoria fisica.

  1. Il primo è che è possibile eseguire applicazioni che richiedono memoria aggiuntiva, anche se ciò significa scambiare su disco.
  2. Layout di memoria più puliti per partizionare l'utilizzo della memoria. Ad esempio, un sistema operativo potrebbe prendere indirizzi con un numero più alto e lasciare indirizzi con un numero inferiore per consentire alle applicazioni di rendere più pulita la separazione.
  3. La randomizzazione del layout dello spazio indirizzo è un po 'più efficace.
  4. Contrassegnare le pagine come eseguibili può significare memoria residua.
  5. I / O mappati in memoria.
  6. L'allocazione della memoria è più semplice: si possono allocare blocchi più grandi alla volta.
  7. Frammentazione della memoria ridotta

1
Grazie! 1) è così evidente e basilare che mi sento in imbarazzo per la domanda;)
gsi-frank

2
(3) è anche molto importante. Volete davvero uno spazio di indirizzi virtuale con ordini di grandezza maggiori della quantità di memoria che assegnerete in modo che le ipotesi casuali quasi sicuramente sfocino in trappole.
R ..

6

Quelle sono limitazioni hardware. L'attuale hardware x86_64 / amd64 consente indirizzi virtuali a 48 bit e varie dimensioni (dipende dall'implementazione, ad esempio la mia workstation qui supporta solo 36 bit) indirizzi fisici. Il kernel Linux divide a metà lo spazio degli indirizzi virtuali (usando metà per il kernel, metà per spazio utente, proprio come su x86).

Quindi ottieni:

2⁴⁸ byte ÷ 2 = 2⁴⁷ byte = 128 TiB

La dimensione dell'indirizzo fisico è spesso inferiore perché in realtà è fisica. Occupa pin / pad, transistor, connessioni, ecc., Sulla / nella CPU e traccia le linee sulla scheda. Probabilmente anche lo stesso nei chipset. Non ha senso sostenere una quantità di ram che è inconcepibile per la durata del design del core del processore o del socket: tutte queste cose costano denaro. (Anche con 32 slot DIMM e DIMM da 64Gb ciascuno, sei ancora solo a 2 TB. Anche se la capacità del DIMM raddoppia ogni anno, siamo a 5 anni da 64 TB.

Come sottolinea Peter Cordes , le persone stanno ora collegando una memoria non volatile come 3D XPoint al bus di memoria, il che rende concepibile l'esaurimento dello spazio degli indirizzi. I processori più recenti hanno esteso lo spazio degli indirizzi fisici a 48 bit; è possibile che il wiki Debian non sia stato aggiornato.


Lo storage non volatile collegato direttamente al bus di memoria (ad es. 3D XPoint) sta diventando una cosa, e questo potrebbe aumentare notevolmente la domanda di spazio di indirizzamento fisico nei prossimi anni (poiché è più denso della DRAM, ed è utile avere carichi di barca di esso in più casi di quanto sia utile disporre di carichi di memoria RAM). Vedi zdnet.com/article/the-non-volatile-memory-revolution per un articolo non molto tecnico (o google per cose migliori). Intel Skylake lo supporta con le sue clflushe le clflushoptistruzioni.
Peter Cordes,

1
Puoi già acquistare sistemi con fino a 12 TB di RAM in 96 slot ( ad esempio il sistema HPC a quattro socket di Tyan ), quindi 64 TB potrebbero essere a meno di cinque anni di distanza. E alcune persone li comprano e li adattano a tanta RAM ...
Stephen Kitt il

@StephenKitt hmm, va bene perché la capacità del modulo DIMM impiega circa 3 anni per raddoppiare 😁
derobert

Si scopre che ora puoi effettivamente acquistare sistemi con 64 TiB di RAM .
Stephen Kitt,
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.