L'immagine seguente mostra come è suddiviso uno spazio di indirizzi virtuali di processo a 32 bit:
Ma come viene suddiviso uno spazio di indirizzi virtuali di processo a 64 bit?
Risposta accettata:
x86
La mappa di memoria virtuale x86 a 64 bit divide lo spazio degli indirizzi in due:la sezione inferiore (con il bit superiore impostato su 0) è lo spazio utente, la sezione superiore (con il bit superiore impostato su 1) è lo spazio del kernel. (Si noti che x86-64 definisce indirizzi "canonici" "metà inferiore" e "metà superiore", con un numero di bit effettivamente limitato a 48 o 56; vedere Wikipedia per i dettagli.)
La mappa completa è documentata in dettaglio nel kernel; attualmente sembra
Inizia addr | Offset | Indirizzo finale | Taglia | Descrizione area VM |
---|---|---|---|---|
0000_0000_0000_0000 | 0000_7fff_ffff_ffff | 128 TiB | memoria virtuale spazio utente | |
0000_8000_0000_0000 | +128 TiB | ffff_7fff_ffff_ffff | ~16 milioni di TiB | non canonico |
ffff_8000_0000_0000 | -128 TiB | ffff_ffff_ffff_ffff | 128 TiB | memoria virtuale nello spazio del kernel |
con indirizzi virtuali a 48 bit. (La variante a 56 bit ha la stessa struttura, con 64 PiB di spazio degli indirizzi utilizzabile su entrambi i lati di un foro PiB da 16.000.)
(Si noti che 16KPiB =16MTiB =2 byte.)
A differenza del case a 32 bit, la mappa di memoria a "64 bit" riflette direttamente i vincoli hardware.
BRACCIO
ARM a 64 bit ha una distinzione di indirizzi simile nell'hardware:i primi sedici bit sono 0 per lo spazio utente, 1 per lo spazio kernel. Linux utilizza 39, 42 o 48 bit per gli indirizzi virtuali, a seconda del numero di livelli di tabella delle pagine e delle dimensioni della pagina. Con ARMv8.2-LVA, vengono aggiunti altri quattro bit, risultando in indirizzi virtuali a 52 bit.
Questo è anche documentato in dettaglio nel kernel.