WHDLoad e la MMU

### WHDLoad e la Memory Management Unit (MMU)

L' MMU è contenuta nei seguenti processori della famiglia 68000: 68030, 68040, 68060. Esistono anche delle versioni chiamate EC di questi processori che possiedono una MMU "fuori servizio" (rotta o comunque malfunzionante e quindi disabilitata). Per esempio tutti i sistemi standard A4000/030 possiedono una CPU 68EC030. Nelle schede acceleratrici di terze parti le cose sono differenti, controlla la loro documentazione per saperne di più. Per quanto ne sappia, tutti i 68040/68060 mai utilizzati in un Amiga sono CPU complete che contengono una MMU funzionante (perché la modalità burst e Zorro III richiedono una mappatura dello spazio di IO fornita dalla MMU). La distinzione fra una CPU completa ed una in versione EC non può essere fatta via software (almeno in tempi accettabili). Pertanto l'utente deve farlo settando le opzioni corrette per WHDLoad.
Per il 68020 è disponibile una MMU esterna chiamata 68851, ma non è correntemente supportata da WHDLoad.

#### Caratteristiche di una MMU ed il suo utilizzo in WHDLoad

L'utilizzo principale della MMU è di tradurre indirizzi logici in indirizzi fisici. Questo è necessario per la memoria virtuale e spazi di indirizzamento separati (per esempio in un sistema multi-processo protetto). Un'altra caratteristica è di specificare proprietà speciali come Supervisore, Protetto in Scrittura e la modalità di caching per ogni spazio di indirizzamento fisico (in base a pagine, dove una pagina in WHDLoad ha una dimensione di 4096 byte). WHDLoad non utilizza la traduzione da indirizzi logici a fisici. Invece utilizza la MMU per memoria protetta, gestione delle cache e alcune caratteristiche speciali (Snooping, resload_Protect#?).

#### La protezione della memoria in WHDLoad

All'avvio, WHDLoad analizza la memory list e costruisce un translation tree che include tutta la memoria accessibile. Imposta il seguente spazio di indirizzamento come valido e accessibile: $0...BaseMem (utilizzando le informazioni fornite dallo Slave), $dff000...$dff200 (registri Custom), $bfd000...$bff000 (registri Cia) e la memoria usata dallo Slave e WHDLoad. Se viene trovato un Freezer in memoria, la memoria utilizzata dal Freezer stesso viene anch'essa impostata come valida. Tutta la rimanente memoria viene marchiata come non valida, e pertanto ogni accesso a quest'area (in lettura o scrittura) causerà un Access Fault Exception che terminerà in un apposito requester d'errore creato da WHDLoad.

#### Controllo da parte dell'utente dell'utilizzo della MMU in HDLoad

Ci sono 3 modi differenti in cui WHDLoad può utilizzare la MMU.

1. ignore MMU (ignora MMU):
   In questa modalità WHDLoad non cambierà nessun registro MMU. Questo può tornare utile se hai programmi in esecuzione che utilizzano la MMU e vuoi che le funzionalità di questi programmi rimangano inalterate (per esempio un Freezer software come TK).
   Attenzione: per il fatto che WHDLoad non controlla la MMU possono saltar fuori molti problemi. Questi problemi possono essere crash, malfunzionamenti o altre imprevedibili casualità. Di seguito una lista di possibili rischi:
   - eseguire Enforcer/CyberGuard o un simile programma può bloccare/mandare in crash il sistema, perché WHDLoad creerà un bel pò di Hits ogni volta che passerà dall/all'OS. Questi Hits non sono bug di WHDLoad ma parte del suo normale funzionamento.
   - recenti versioni della 68060.library (a partire dalla v41.1) rimappano la memoria $0-$1000 (la prima pagina) in una locazione della memoria Fast tramite la MMU, nella modalità "ignora MMU" questa traduzione di indirizzi rimarrà intatta, e se il programma installato tenterà di usare quest'area per una qualsiasi azione DMA (per esempio una copperlist in quest'area) il risultato sarà imprevedibile, perché la CPU leggerà/scriverà la locazione nella memoria Fast mentre il DMA la reale memoria Chip che conterrà dati a caso.
   - se il programma che utilizza la MMU dipende dal suo exception handler ("Access Fault" exception) l'opzione NoTrapHandler/S deve essera attivata, altrimenti ogni eccezione verrà gestita da WHDLoad, che terminerà il programma installato se accadrà qualcosa di non voluto
   - se il programma che utilizza la MMU utilizza memoria (exception handler, translation tree, ...) all'interno della BaseMem del programma installato, andrà crash, perché la BaseMem verrà sovrascritta durante l'esecuzione del programma installato (temporaneamente)
   - in generale ogni programma che cambia le funzioni di base del sistema (mediante utilizzo della MMU) può andare in conflitto con WHDLoad ...
2. disable MMU (disabilita MMU):
   In questa modalità, che è posssibile solo su 68030, la MMU verrà disabilitata da WHDLoad, nessuna caratteristica della MMU sarà disponibile.
3. use MMU (usa MMU):
   In questa modalità WHDLoad prende il pieno controllo della MMU ed attiva la memoria protetta e la gestione delle cache come spiegato sopra.

Nel 68030 la modalità di default (preselezionata) è disable MMU. Nei 68040/68060 il default è use MMU. Ci sono due opzioni per controllare questo modo di funzionare. MMU/S forza WHDLoad a usare la MMU ed è richiesto nei sistemi 68030 per ottenere le funzionalità della MMU. NoMMU/S disabilita l'utilizzo della MMU da parte di WHDLoad (ignore MMU).

An Enforcer hit is an Enforcer hit, period. (Michael Sinz)