Spazi indirizzi virtuali
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.
Esistono diversi vantaggi per accedere alla memoria usando gli indirizzi virtuali:
Un programma può usare un intervallo contiguo di indirizzi virtuali per accedere a un buffer di memoria di grandi dimensioni non contiguo 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 è bassa, la gestione memoria salva le pagine di memoria fisica (in genere 4 kilobyte di dimensioni) in un file disco. Il sistema sposta pagine di dati o codice tra memoria fisica e 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 virtuali del processo. Ogni processo in modalità utente ha uno spazio indirizzi virtuale privato.
Un processo a 32 bit include in genere uno spazio indirizzi virtuale all'interno dell'intervallo di 2 gigabyte 0x00000000 tramite 0x7FFFFFFF.
Un processo a 64 bit in Windows a 64 bit dispone di uno spazio indirizzi virtuale all'interno dell'intervallo 128-terabyte 0x000'00000000 attraverso 0x7FFF'FFFFFFFFFF.
Un intervallo di indirizzi virtuali viene talvolta chiamato intervallo di memoria virtuale. Per altre informazioni, vedere Limiti dello spazio di memoria e 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 personalizzato, compreso tra 0x000'00000000 e 0x7FF'FFFFFFFFFF. Ogni blocco ombreggiato rappresenta una pagina (4 kilobyte di dimensioni) di memoria virtuale o fisica. Il processo Blocco note usa tre pagine contigue di indirizzi virtuali, a partire da 0x7F7'93950000. Tuttavia, queste tre pagine contigue di indirizzi virtuali vengono mappate a pagine non contigue in memoria fisica. Entrambi i processi usano anche 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. Componenti del sistema operativo principali e molti driver eseguiti nella modalità kernel con privilegi più elevati. Per altre informazioni sulle modalità processore, vedere Modalità utente e modalità kernel.
Ogni processo in modalità utente ha uno spazio indirizzi virtuale privato, ma tutto il codice in esecuzione in modalità kernel condivide un singolo spazio indirizzi virtuale denominato spazio di sistema. Lo spazio indirizzi virtuale per un processo in modalità utente è denominato spazio utente.
In Windows a 32 bit, lo spazio indirizzi virtuale disponibile totale è 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 (al momento dell'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 è 2^64 byte (16 exabyte), ma viene effettivamente usata solo una piccola parte dell'intervallo 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 le strutture dei dati del sistema operativo protette. Il codice in esecuzione in modalità kernel può accedere sia allo spazio utente che allo spazio di sistema. Vale a dire, il codice in esecuzione in modalità kernel può accedere allo spazio di sistema e allo spazio indirizzi virtuale del processo in modalità utente corrente.
I driver in esecuzione in modalità kernel devono prestare attenzione quando si legge direttamente da o scrivendo agli indirizzi nello spazio utente. Lo scenario seguente illustra perché.
Un programma in modalità utente avvia una richiesta per leggere 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 fornito nel passaggio 1. Questo indirizzo si trova nello spazio indirizzi virtuale del processo che ha avviato la richiesta, che probabilmente non è uguale al processo corrente.
Pool con pagine e pool non con pagine
Nello spazio utente tutte le pagine di memoria fisica possono essere visualizzate in un file su disco in base alle esigenze. Nello spazio di sistema alcune pagine fisiche possono essere visualizzate e altre non possono. Lo spazio di sistema ha due aree per l'allocazione dinamica della memoria: pool con pagine e pool non a pagina.
La memoria allocata nel pool di pagine può essere visualizzata in un file su disco in base alle esigenze. La memoria allocata nel pool non a pagina non può mai essere paginata in un file del disco.