# Unità di gestione della memoria

L'unità di gestione della memoria (in acronimo MMU, dall'inglese Memory Management Unit), indica una classe di componenti hardware che gestisce le richieste di accesso alla memoria generate dalla CPU.

## Storia

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 Z8010 usato dalla famiglia di processori Z8000 della ZiLOG. CPU più moderne quali il Motorola 68030 e lo Zilog Z280 possiedono MMU integrate nello stesso chip.
La maggior parte delle MMU 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. Per esempio, l'architettura x86 può funzionare con memoria segmentata oltre che paginata.

## Descrizione e caratteristiche

Le MMU moderne generalmente suddividono lo spazio degli indirizzi virtuali (l'intervallo di indirizzi accessibili dal processore) in pagine di memoria dimensione $2^{N}$, tipicamente pochi kilobyte. 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'indirizzo 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 deve 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 a ogni processo il suo spazio di indirizzamento virtuale.

## Utilizzo

La MMU può avere vari compiti tra cui la traslazione (o traduzione) degli indirizzi logici e simbolici 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.
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.