WHDLoad i MMU

### WHDLoad i Jednostka Zarządzająca Pamięcią (MMU)

MMU posiadają następujące procesory: 68030, 68040, 68060. Istnieją również tak zwane wersje EC tych procesorów, które nie posiadają MMU. Dla przykładu, wszystkie standardowe A4000/030 posiadają procesor 68EC030. Karty turbo wykonane przez firmy trzecie przedstawiają zgoła odmienną sytuację w tej materii i więcej na ich temat można dowiedzieć się z dostarczanej wraz z nimi dokumentacji. Z tego co wiem, wszystkie procesory 68040/68060 posiadają pełne procesory, czyli wyposażone w MMU (gdyż tryb burst i Zorro III wymagają mapowania MMU przez przestrzeń urządzeń wejścia/wyjścia). Brak MMU na procesorach EC nie może zostać nadrobiony poprzez oprogramowanie. Mimo wszystko, wszystko wymaga osobnych ustawień we właściwych opcjach WHDLoad.
Procesory 68020 wyposażone są w zewnętrzne MMU zwane 68851. Póki co, nie jest ono obsługiwane przez WHDload.

#### Cechy MMU i wykorzystanie ich przez WHDLoad

Głównym zadaniem MMU jest tłumaczenie logicznych adresów na fizyczne. Wymagane jest to dla pamięci wirtualnej i wydzielonej przestrzeni adresowej (dla przykładu w chronionych systemach wielozadaniowych). Kolejną cechą jest precyzowanie specjalnych właściwości, takich jak tryb "Tylko Nadzorca" (Supervisor Only), tryb zabezpieczenia przed zapisem (Write Protected) czy tryb buforowania dla każdej fizycznej przestrzeni adresowej (na podstawie strony pamięci, która w WHDLoad posiada rozmiar 4096 bajtów). WHDLoad nie korzysta z tłumaczenia adresów logicznych na fizyczne. Wykorzystuje MMU do ochrony pamięci, zarządzania cache i kilku innych specjalnych funkcji (Snooping, resload_Protect#?).

#### Ochrona pamięci w WHDLoad

. Na początku, WHDLoad skanuje listę pamięci i buduje drzewo tłumaczeń (translation tree), które zawiera wszystkie adresy dostępnej pamięci. Zaznacza poniższe adresy przestrzeni jak prawidłowe i dostępne: $0...BaseMem (wykorzystując informacje z pliku .slave), $dff000...$dff200 (rejestry Custom), $bfd000...$bff000 (rejestry Cia) i pamięc wykorzystana przez plik .slave i WHDLoad. Jeżeli w pamięci znajduje się program zatrzymujący działanie innych programów, pamięć przez niego wykorzystywana również oznaczana jest jako dostępna. Każdy inny obszar pamięci oznaczany jest jako niedostępny. Każdy dostęp do takiej pamięci (zapis lub odczyt) spowoduje wyjątek błędu dostępu (Access Fault Exception), który zakończony zostanie stosownym komunikatem wytworzonym przez WHDLoad.

#### Kontrola MMU w WHDLoad z poziomu użytkownika

Istnieją trzy różne tryby w jakich WHDLoad może wpływać na MMU.

1. ignorowanie MMU:
   W tym trybie WHDLoad nie zmienia rejestrów MMU. Może być to użyteczne w sytuacji, gdy uruchamiamy programy, które nie życzą sobie obecności MMU.
   Ostrzeżenie: ponieważ WHDLoad nie kontroluje MMU, mogą występować różne problemy. Mogą one powodować zawieszenia, błędy lub inne trudne do przewidzenia zachowania. Oto lista możliwych sytuacji:
   - uruchomienie Enforcera/CyberGuarda lub podobnego narzędzia zawiesi system ponieważ WHDLoad generuje bardzo dużo "hitów" za każdym razem, gdy wyłącza i włącza OS. "Hity" te nie są błędami WHDLoad, lecz elementami normalnych operacji.
   - nowsze wersje 68060.library (począwszy od v41.1) remapują pamięć $0-$1000 (pierwsza strona) do pamięci Fast przy pomocy MMU. W przypadku ignorowania MMU ten adres pozostanie nienaruszony. Jeśli zainstalowany program próbuje wykorzystać ten obszar do jakichkolwiek działań DMA (np. wykorzystanie copperlisty w tym obszarze), rezultaty mogą być nieprzewidywalne, gdyż procesor będzie zapisywał/odczytywał położenie pamięci Fast, podczas gdy prawdziwa pamięć Chip wykorzystywana przez DMA zawiera losowe dane.
   - jeśli uruchamiany program wykorzystuje MMU i zależny jest od obsługi wyjątków ("Access Fault" exception) opcja NoTrapHandler/S musi być włączona. W przeciwnym razie każde wystąpienie wyjątku będzie obsużony przez WHDLoad, który po prostu wyłączy zainstalowany program.
   - jeśli uruchamiany program wykorzystuje MMU i korzysta z jakiejkolwiek dostępnej pamięci (exception handler, translation tree, itd.) wewnątrz BaseMem zainstalowanego programu, może spowodować zawieszenie, ponieważ BaseMem zostanie nadpisana (tymczasowo) podczas wykonywania zainstalowanego programu.
   - ogólnie, każdy program, który zmienia podstawowe funkcje systemu (używając MMU) może powodować konflikt z WHDLoad ...
2. wyłączenie MMU:
   W tym trybie, który jest możliwy tylko na 68030, MMU zostanie wyłączone przez WHDLoad. Żadne funkcje powiązane z MMU nie są dostępne.
3. wykorzystanie MMU:
   W tym trybie WHDLoad przejmuje pełną kontrolę nad MMU i dokonuje ochrony pamięci i zarządzania cache tak, jak to opisano powyżej.

Na 68030 domyślnie ustawione jest wyłączenie MMU. Na 68040/68060 domyślnie ustawione jest wykorzystanie MMU. Istnieją dwie opcje, które to kontrolują. MMU/S zmusza WHDLoad do wykorzystania MMU i jest wymagane na procesorach 68030, aby MMU zaczęło działać. NoMMU/S wyłącza użycie MMU przez WHDLoad (ignorowanie MMU).

Czasem "hit" Enforcera jest "hitem" Enforcera. (Michael Sinz)