Architetture dei processori/Memory Management Unit

Una Memory Management Unit (MMU) in un processore ha vari compiti, tra cui la traslazione (o traduzione) degli indirizzi virtuali in indirizzi fisici (necessaria per la gestione della memoria virtuale), la protezione della memoria, il controllo della cache della CPU, l'arbitraggio del bus, e, in architetture più semplici (specialmente nei sistemi a 8-bit), la commutazione di banchi di memoria.

L'80286, il primo processore della famiglia X86 dotato di MMU

Le MMU moderne generalmente suddividono lo spazio degli indirizzi virtuali (l'intervallo di indirizzi accessibili dal processore) in pagine di memoria dimensione 2N, tipicamente pochi kilobytes. Gli N bit meno significativi dell'indirizzo (l‘offset all'interno della pagina) rimangono invariati, mentre i bit restanti rappresentano il numero virtuale della pagina. La MMU contiene una tabella delle pagine indicizzata (possibilmente associativamente) dal numero della pagina. Ogni elemento di questa tabella (detto PTE o Page Table Entry) restituisce il numero fisico della pagina corrispondente a quello virtuale, che, combinato con l'offset della pagina, forma l'idirizzo fisico completo.

Un PTE può includere anche informazioni su quando la pagina è stata usata per l'ultima volta (per l'algoritmo di sostituzione LRU), quale tipo di processi (utente o supervisore) può leggerla e scriverla, e se dovrebbe essere inserita nella cache.

È possibile che non esista memoria fisica (RAM) allocata a una data pagina virtuale. In questo caso, la MMU segnala una condizione di «pagina di memoria mancante» (page fault) alla CPU. Il sistema operativo interviene per gestire questa condizione, cerca di trovare una pagina libera nella RAM e di creare una nuova PTE nella quale mappare l'indirizzo virtuale richiesto nell'indirizzo fisico della pagina trovata. Quando non c'è spazio disponibile nella RAM per una nuova pagina di memoria, può essere necessario scegliere una pagina esistente utilizzando un algoritmo di sostituzione, farne una copia su disco rigido e rimpiazzarla con quella nuova. Analogamente, quando non ci sono PTE inutilizzate a disposizione, il sistema operativo deve liberarne una.

In alcuni casi un page fault può indicare un errore nel software. Uno dei benefici della MMU è la protezione della memoria: un sistema operativo può usarla per proteggere la memoria da processi erranti, impedendo a un processo di accedere a locazioni di memoria non autorizzate. Tipicamente, il sistema operativo assegna ad ogni processo il suo spazio di indirizzamento virtuale.

La MMU riduce anche il problema della frammentazione della memoria. Dopo che blocchi di memoria precedentemente allocati sono stati liberati, la memoria libera può diventare frammentata (discontinua) quindi il blocco più grande di memoria libera contigua può essere molto più piccolo del totale. Con la memoria virtuale, blocchi non contigui di memoria fisica possono essere mappati in indirizzi virtuali contigui.

Nelle prime realizzazioni, la gestione della memoria era eseguita in un circuito integrato separato dalla CPU, come ad esempio l'MC 68851 usato dalla CPU Motorola 68020 nel Macintosh II, o lo Z8015 usato dalla famiglia di processori Z80 della Zilog. CPU più moderne quali il Motorola 68030 e lo Zilog Z280 possiedono MMU integrate nello stesso chip.

La maggior parte delle MMU moderne, come quelle descritte, funzionano con sistemi di memoria paginata. Esistono tuttavia altri sistemi per organizzare la memoria, come la segmentazione e l'indirizzamento base-limite, che ne è uno sviluppo. Alcune MMU funzionano anche con questi sistemi di memoria, che benché meno frequenti sono utilizzati in alcune architetture moderne di rilevanza notevole. Ad esempio, l'architettura x86 può funzionare con memoria segmentata oltre che paginata.