Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
I processori usano indirizzi virtuali durante la lettura o la scrittura in posizioni di memoria. Durante queste operazioni, il processore converte l'indirizzo virtuale in uno fisico.
L'accesso alla memoria tramite indirizzi virtuali offre diversi vantaggi:
Un programma può usare un intervallo contiguo di indirizzi virtuali per accedere a un buffer di memoria non contiguo di grandi dimensioni nella memoria fisica.
Un programma può usare un intervallo di indirizzi virtuali per accedere a un buffer di memoria maggiore rispetto alla memoria fisica disponibile. Quando la memoria fisica è insufficiente, gestione memoria salva le pagine di memoria fisica (in genere 4 kilobyte di dimensioni) in un file su disco. Il sistema sposta pagine di dati o codice tra la memoria fisica e il disco in base alle esigenze.
Gli indirizzi virtuali usati da processi diversi sono isolati. Il codice in un processo non può modificare la memoria fisica usata da un altro processo o dal sistema operativo.
L'intervallo di indirizzi virtuali disponibili per un processo è noto come spazio indirizzi virtuale processo. Ogni processo in modalità utente ha uno spazio indirizzi virtuale privato.
Un processo a 32 bit ha in genere uno spazio degli indirizzi virtuali compreso tra 0x00000000 e 0x7FFFFFFF all'interno di un intervallo di 2 gigabyte.
Un processo a 64 bit su Windows a 64 bit ha uno spazio di indirizzi virtuale nell'intervallo di 128 terabyte, da 0x000'00000000 fino a 0x7FFF'FFFFFFFF.
Un intervallo di indirizzi virtuali viene talvolta definito intervallo di memoria virtuale . Per altre informazioni, vedere limiti di memoria e spazio degli indirizzi.
Il diagramma seguente illustra alcune funzionalità chiave degli spazi indirizzi virtuali.
Il diagramma mostra gli spazi indirizzi virtuali per due processi a 64 bit: Notepad.exe e MyApp.exe. Ogni processo ha uno spazio indirizzi virtuale, compreso tra 0x000'0000000 e 0x7FF'FFFFFFFF. Ogni blocco ombreggiato rappresenta una pagina (dimensioni di 4 kilobyte) di memoria virtuale o fisica. Il processo Blocco Note utilizza tre pagine contigue di indirizzi di memoria virtuale, a partire da 0x7F7'93950000. Tuttavia, queste tre pagine contigue di indirizzi virtuali vengono mappate a pagine non contigue in memoria fisica. Inoltre, entrambi i processi usano una pagina di memoria virtuale a partire da 0x7F7'93950000, ma queste pagine virtuali vengono mappate a pagine diverse di memoria fisica.
Spazio utente e spazio di sistema
Processi come Notepad.exe e MyApp.exe eseguiti in modalità utente. I componenti principali del sistema operativo e molti driver vengono eseguiti nella modalità kernel con privilegi più elevati. Per altre informazioni sulle modalità del processore, vedere modalità utente e modalità kernel.
Ogni processo in modalità utente ha uno spazio indirizzi virtuale privato, ma tutto il codice eseguito in modalità kernel condivide un singolo spazio indirizzi virtuale denominato spazio di sistema . Lo spazio degli indirizzi virtuali per un processo in modalità utente viene chiamato spazio utente.
In Windows a 32 bit, lo spazio indirizzi virtuale disponibile totale è di 2^32 byte (4 gigabyte). In genere, i 2 gigabyte inferiori vengono usati per lo spazio utente e i 2 gigabyte superiori vengono usati per lo spazio di sistema.
In Windows a 32 bit è possibile specificare (in fase di avvio) che sono disponibili più di 2 gigabyte per lo spazio utente. Ciò significa tuttavia che per lo spazio di sistema sono disponibili meno indirizzi virtuali. È possibile aumentare le dimensioni dello spazio utente fino a 3 gigabyte, lasciando solo 1 gigabyte per lo spazio di sistema. Per aumentare le dimensioni dello spazio utente, usare BCDEdit /set increaseuserva.
In Windows a 64 bit, la quantità teorica di spazio indirizzi virtuale è di 2^64 byte (16 exabyte), ma viene effettivamente usata solo una piccola parte dell'intervallo di 16-exabyte.
Il codice in esecuzione in modalità utente può accedere allo spazio utente, ma non allo spazio di sistema. Questa restrizione impedisce al codice in modalità utente di leggere o modificare strutture di dati del sistema operativo protette. Il codice in esecuzione in modalità kernel può accedere sia allo spazio utente che allo spazio di sistema. Ovvero, il codice in esecuzione in modalità kernel può accedere allo spazio di sistema e allo spazio degli indirizzi virtuali del processo in modalità utente corrente.
I driver in esecuzione in modalità kernel devono prestare attenzione quando leggono direttamente da o scrivono su indirizzi nello spazio degli utenti. Lo scenario seguente illustra perché.
Un programma in modalità utente avvia una richiesta di lettura di alcuni dati da un dispositivo. Il programma fornisce l'indirizzo iniziale di un buffer per ricevere i dati.
Una routine del driver di dispositivo, in esecuzione in modalità kernel, avvia l'operazione di lettura e restituisce il controllo al chiamante.
Successivamente, il dispositivo interrompe il thread attualmente in esecuzione per indicare che l'operazione di lettura è stata completata. Le routine del driver in modalità kernel gestiscono l'interruzione in questo thread arbitrario, che appartiene a un processo arbitrario.
A questo punto, il driver non deve scrivere i dati nell'indirizzo iniziale fornito dal programma in modalità utente nel passaggio 1. Questo indirizzo si trova nello spazio degli indirizzi virtuali del processo che ha avviato la richiesta, che probabilmente non corrisponde al processo corrente.
Pool con paging e pool non paginati
Nello spazio utente tutte le pagine di memoria fisica possono essere inserite in un file su disco in base alle esigenze. Nello spazio di sistema, alcune pagine fisiche possono essere paginabili, mentre altre no. Lo spazio di sistema ha due aree per l'allocazione dinamica della memoria: pool con paginazione e pool senza paginazione.
La memoria allocata nel pool di memoria paginata può essere trasferita in un file su disco secondo necessità. La memoria allocata nel pool non paginato non può mai essere spostata su un file su disco.