Perché i sistemi x86-64 hanno solo uno spazio di indirizzi virtuali a 48 bit?

In un libro ho letto quanto segue:

I processori a 32 bit hanno 2 ^ 32 indirizzi possibili, mentre gli attuali processori a 64 bit hanno uno spazio di indirizzamento a 48 bit

La mia aspettativa era che se si tratta di un processore a 64 bit, lo spazio degli indirizzi dovrebbe essere anche 2 ^ 64.

Quindi mi chiedevo qual è la ragione di questa limitazione?

Perché è tutto ciò che serve. 48 bit ti danno uno spazio di indirizzamento di 256 terabyte. Questo è molto. Non vedrai un sistema che ha bisogno di qualcosa in più di tanto presto.

Quindi i produttori di CPU hanno preso una scorciatoia. Usano un set di istruzioni che consente uno spazio di indirizzamento completo a 64 bit, ma le CPU attuali usano solo i 48 bit inferiori. L’alternativa era sprecare i transistor sulla gestione di uno spazio di indirizzi più ampio che non sarebbe stato necessario per molti anni.

Quindi, una volta che ci avviciniamo al limite di 48 bit, è solo questione di rilasciare CPU che gestiscono lo spazio di indirizzamento completo, ma non richiederà alcuna modifica al set di istruzioni e non interromperà la compatibilità.

Qualsiasi risposta che si riferisca alla dimensione del bus e alla memoria fisica è leggermente errata, poiché la domanda di OP riguardava lo spazio degli indirizzi virtuali e non lo spazio degli indirizzi fisico . Per esempio il limite apparentemente analogo su alcuni 386 era un limite alla memoria fisica che potevano usare, non lo spazio di indirizzamento virtuale, che era sempre pieno di 32 bit. In linea di principio è ansible utilizzare 64 bit completi di spazio di indirizzamento virtuale anche con solo pochi MB di memoria fisica; Ovviamente lo si può fare scambiando, o per compiti specializzati in cui si desidera mappare la stessa pagina alla maggior parte degli indirizzi (ad es. certe operazioni di dati sparse).

Penso che la vera risposta sia che AMD era a buon mercato e sperava che a nessuno sarebbe importato, ma non ho riferimenti per citare.

Leggi la sezione delle limitazioni dell’articolo di Wikipedia :

Un PC non può contenere 4 petabyte di memoria (a causa delle dimensioni dei chip di memoria attuali se non altro) ma AMD ha immaginato grandi server, cluster di memoria condivisa e altri usi dello spazio di indirizzamento fisico che potrebbero avvicinarsi a questo nel prossimo futuro, e il 52 l’indirizzo fisico di bit offre ampio spazio per l’espansione senza incorrere nel costo di implementazione di indirizzi fisici a 64 bit

Cioè, non c’è alcun modo di implementare l’indirizzamento a 64 bit completo a questo punto, perché non possiamo build un sistema in grado di utilizzare tale spazio di indirizzamento per intero – quindi selezioniamo qualcosa che sia pratico per i sistemi di oggi (e di domani).

La larghezza del registro / operazione interno interno non deve essere riflessa nella larghezza del bus indirizzo esterno.

Supponiamo che tu abbia un processore a 64 bit che deve accedere solo a 1 megabyte di RAM. Tutto ciò che serve è un bus indirizzo a 20 bit. Perché preoccuparsi del costo e della complessità hardware di tutti i pin aggiuntivi che non userete?

Il Motorola 68000 era così; 32 bit internamente, ma con un bus di indirizzo a 23 bit (e un bus dati a 16 bit). La CPU poteva accedere a 16 megabyte di RAM e per caricare il tipo di dati nativo (32 bit) sono stati necessari due accessi alla memoria (ciascuno con 16 bit di dati).

Dal mio punto di vista, questo è il risultato della dimensione della pagina. Ogni pagina contiene al massimo 4096/8 = 512 voci della tabella della pagina. E 2 ^ 9 = 512. Quindi 9 * 4 + 12 = 48.

C’è un motivo più grave del semplice salvataggio dei transistor nel percorso dell’indirizzo della CPU: se si aumenta la dimensione dello spazio indirizzo è necessario aumentare la dimensione della pagina, aumentare la dimensione delle tabelle della pagina o avere una struttura della tabella di pagina più profonda (quella sono più livelli di tabelle di traduzione). Tutte queste cose aumentano il costo di una mancata TLB, il che danneggia le prestazioni.

Non è vero che vengono usati solo i 48 bit di basso livello di un VA a 64 bit, almeno con Intel 64. I 16 bit superiori sono usati, una specie di, tipo di.

La sezione 3.3.7.1 Indirizzamento canonico nel Manuale dello sviluppatore del software per architetture Intel® 64 e IA-32 dice:

un indirizzo canonico deve avere i bit da 63 a 48 impostati su zero o uno (a seconda che il bit 47 sia zero o uno)

Quindi i bit da 47 a 63 formano un super-bit, o tutti 1 o tutti 0. Se un indirizzo non è in forma canonica, l’implementazione dovrebbe essere errata.

Su AArch64, questo è diverso. Secondo ARMv8 Instruction Set Overview , è un VA a 49 bit.

Il sistema di traduzione della memoria AArch64 supporta un indirizzo virtuale a 49 bit (48 bit per tabella di conversione). Gli indirizzi virtuali sono sign-extended da 49 bit e memorizzati all’interno di un puntatore a 64 bit. Facoltativamente, sotto il controllo di un registro di sistema, gli 8 bit più significativi di un puntatore a 64 bit possono contenere un “tag” che verrà ignorato quando viene utilizzato come indirizzo di caricamento / archivio o destinazione di un ramo indiretto

Una CPU è considerata “N-bit” principalmente sulla sua dimensione del bus di dati, e su gran parte delle sue entity framework (architettura interna) : Registri, Accumulatori, Aritmetica-Logica-Unità (ALU), Set di istruzioni, ecc. Ad esempio: La buona vecchia CPU Motorola 6800 (o Intel 8050) è una CPU a 8 bit. Ha un bus dati a 8 bit, un’architettura interna a 8 bit e un bus indirizzo a 16 bit.


  • Sebbene la CPU N-bit possa avere quadro diverse dalle N dimensioni. Ad esempio gli impoverimenti nel 6809 sul 6800 (entrambi sono CPU a 8 bit con bus dati a 8 bit). Tra i miglioramenti significativi introdotti nel 6809 c’erano l’uso di due accumulatori a 8 bit (A e B, che potevano essere combinati in un singolo registro a 16 bit, D), due registri indice a 16 bit (X, Y) e due Puntatori di stack a 16 bit.

Molte persone hanno questo malinteso. Ma ti prometto che se lo leggerai attentamente, dopo aver letto tutto questo sarà chiaro.

Dire che un processore a 32 bit o 64 bit non significa che dovrebbe avere rispettivamente il bus indirizzo a 32 bit o il bus indirizzo a 64 bit! … Lo ripeto NON !!

Processore a 32 bit significa che ha ALU a 32 bit (Aritmetica e Unità Logica) … ciò significa che può operare su operandi binari a 32 bit (o semplicemente dicendo un numero binario con 32 cifre) e analogamente un processore a 64 bit può operare su binari a 64 bit operando. Quindi, il tempo di un processore a 32 bit o 64 bit NON significa che è ansible installare la quantità massima di memoria. Mostrano solo quanto può essere grande l’operando … (per analogia puoi pensare a una calcolatrice a 10 cifre in grado di calcolare risultati fino a 10 cifre … non può darci 11 cifre o altri risultati più grandi … anche se è in decimali, ma sto dicendo questa analogia per semplicità) … ma quello che stai dicendo è lo spazio degli indirizzi che è la dimensione massima della memoria (RAM) direttamente interfacciabile. La dimensione massima ansible della RAM è determinata dalla dimensione del bus indirizzo e non è la dimensione del bus dati o anche l’ALU su cui è definita la dimensione del processore (32/64 bit). Sì se un processore ha “Bus indirizzo” a 32 bit, allora è in grado di indirizzare 2 ^ 32 byte = 4 GB di RAM (o per 64 bit sarà 2 ^ 64) … ma dire che un processore a 32 bit o 64 bit ha nulla di pertinente a questo spazio indirizzo (spazio indirizzo = fino a che punto può accedere alla memoria o alla dimensione massima della RAM) e dipende solo dalle dimensioni della sua ALU. Ovviamente il bus dati e il bus indirizzo possono essere della stessa dimensione e quindi può sembrare che il processore a 32 bit significhi accedere a 2 ^ 32 byte o 4 GB di memoria … ma è solo una coincidenza e non sarà lo stesso per tutti …. ad esempio Intel 8086 è un processore a 16 bit (dato che ha 16 bit di ALU), quindi come si dice dovrebbe aver avuto accesso a 2 ^ 16 byte = 64 KB di memoria, ma non è vero. Può accedere fino a 1 MB di memoria per avere il bus indirizzo a 20 bit …. Puoi avere google se hai qualche dubbio 🙂

Penso di aver chiarito il punto. Ora vieni alla tua domanda … dato che un processore a 64 bit non vuol dire che deve avere un bus di indirizzo a 64 bit quindi non c’è nulla di sbagliato nell’avere un bus di indirizzo a 48 bit in un processore a 64 bit … hanno mantenuto lo spazio degli indirizzi più piccolo per rendere il design e la fabbricazione a buon mercato …. dato che nessuno userà una memoria così grande (2 ^ 64 byte) … dove 2 ^ 48 byte è più che sufficiente al giorno d’oggi.