Το WHDLoad και το MMU

### Το WHDLoad και το Memory Managment Unit (MMU)

Ένα MMU περιέχεται στους ακόλουθους επεξεργαστές της οικογένειας 68000: 68030, 68040, 68060. Υπάρχουν επίσης και οι λεγόμενες EC εκδόσεις αυτών των επεξεργαστών που έχουν ένα χαλασμένο, εκτός λειτουργίας MMU. Για παράδειγμα, όλες οι standard A4000/030 έχουν μόνο έναν 68EC030 CPU. Σε επιταχυντές τρίτων αυτό είναι διαφορετικό, δείτε στις κατάλληλες οδηγίες για να μάθετε περισσότερα. Από όσο γνωρίζω, όλοι οι 68040/68060 που μπήκαν ποτέ σε Amiga είναι πλήρης CPU και περιέχουν ένα λειτουργικό MMU (γιατί το burstmode και η Zorro III απαιτεί MMU mapping του IO space). Ο διαχωρισμός μεταξύ ενός πλήρης CPU και μίας έκδοσης EC δεν μπορεί να γίνει με λογισμικό (τουλάχιστον σε αποδεκτό χρόνο). Οπότε ο χρήστης πρέπει να το κάνει αυτό ορίζοντας τις κατάλληλες επιλγογές για το WHDLoad.
Για τον 68020 υπάρχει ένα εξωτερικό MMU που ονομάζεται 68851, αλλά αυτό προς το παρόν δεν υποστηρίζεται από το WHDload.

#### Χαρακτηριστικά ενός MMU και η χρήση του στο WHDLoad

Ο κύριος σκοπός του MMU είναι να μεταφράζει λογικές διευθύνσεις σε φυσικές διευθύνσεις. Αυτό απαιτείται για virtual memory και ξεχωριστούς χώρους διευθύνσεων (για παράδειγμα σε ένα προστατευόμενο σύστημα πολυ-διεργασιών). Ένα άλλο χαρακτηριστικό είναι ο ορισμός ειδικών ιδιοτήτων όπως Supervisor Only, Write Protected και Caching mode για κάθε φυσικό χώρο διεύθυνσης (σε βάση σελίδας, όπου μία σελίδα που χρησιμοποιείται από το WHDLoad έχει μέγεθος 4096 bytes). Το WHDLoad δεν χρησιμοποιεί μετάφραση λογικής σε φυσική διεύθυνση. Αλλά χρησιμοποιεί το MMU για προστασία μνήμης, διαχείριση cache και μερικά ειδικά χαρακτηριστικά (Snooping, resload_Protect#?).

#### Προστασία μνήμης στο WHDLoad

Στην εκκίνηση, το WHDLoad σαρώνει τη λίστα μνήμης και δημιουργεί ένα δέντρο μετάφρασης που συμπεριλαμβάνει όλη τη προσβάσιμη μνήμη. Σημειώνει τους ακόλουθους χώρους διευθύσεων ως έγκυρους και προσβάσιμους: $0...BaseMem (χρησιμοποιώντας τις πληροφορίες από το Slave), $dff000...$dff200 (Ειδικοί καταχωρητές), $bfd000...$bff000 (Καταχωρητές Cia) και τη μνήμη που χρησιμοποιείται από το Slave και το WHDLoad. Εάν βρεθεί Freezer στη μνήμη, η μνήμη που χρησιμοποιείται από το Freezer θα σημειωθεί επίσης ως έγκυρη. Όλη η υπόλοιπη μνήμη σημειώνεται ώς άκυρη, και συνεπώς κάθε πρόσβαση σε τέτοια περιοχή (Read ή Write) θα δημιουργήσει μία εξαίρεση Access Fault Exception που θα τερματίσει με ένα κατάλληλο επιλογέα σφάλματος που θα δημιουργηθεί από το WHDLoad.

#### Έλεγχος χρήστη του χειρισμού του MMU στο WHDLoad

Υπάρχουν 3 διαφορετικά modes για το πως το WHDLoad επηρρεάζει ένα MMU.

1. αγνόηση MMU:
   Σε αυτή τη κατάσταση το WHDLoad δεν αλλάζει κανένα καταχωρητή που σχετίζεται με το MMU. Αυτό μπορεί να είναι χρήσιμο αν έχετε προγράμματα που χτυπούν το MMU να τρέχουν και θέλετε οι λειτουργίες αυτών των προγραμμάτων να παραμείνουν άθικτες (για παράδειγμα ένα freezer λογισμικού όπως το TK).
   Προειδοποίηση: Επειδή το WHDLoad δεν ελέγχει το MMU μόνο του είναι πιθανά πολλά προβλήματα. Αυτά τα προβλήματα μπορεί να προκαλέσουν δυσλειτουργίες, ή άλλες απρόβλεπτες συμπεριφορές. Παρακάτω είναι μία λίστα υπαρκτών ρίσκων:
   - τρέχοντας Enforcer/CyberGuard ή αντίστοιχα εργαλεία θα παγώσει/παρουσιάσει crash το μηχάνημα, γιατί το WHDLoad θα δημιουργήσει πολλά Hits κάθε φορά που απενεργοποιεί και ενεργοποιεί το OS. Αυτά τα Hits δεν είναι bugs του WHDLoad αλλά μέρος της κανονικής του λειτουργίας.
   - νεότερες εκδόσεις της 68060.library (ξεκινώντας με τη v41.1) θα προωθήσουν τη μνήμη $0-$1000 (τη πρώτη σελίδα) σε μία περιοχή μνήμης της Fast χρησιμοποιώντας το MMU, στη κατάσταση "αγνόηση MMU" αυτή η μετάφραση μνήμης θα παραμείνη άθικτη, αν το εγκατεστημένο πρόγραμμα προσπαθήσει να χρησιμοποιήσει αυτή τη περιοχή για λειτουργίες DMA (π.χ. ένα copperlist σε αυτή τη περιοχή) τα αποτελέσματα θα είναι απρόβλεπτα, γιατί το CPU θα διαβάσει/γράψει στη περιοχή μνήμης της Fast ενώ τα DMA στην πραγματική μνήμη Chip που περιέχει τυχαία δεδομένα.
   - εάν τα τρέχοντα πράγματα του MMU εξαρτώνται στο χειριστή εξαιρέσεών του (εξαίρεση "Access Fault") η επιλογή NoTrapHandler/S πρέπει να ενεργοποιηθεί, διαφορετικά κάθε εξαίρεση που συμβαίνει θα χειρίζεται από το WHDLoad, που θα τερματίσει το εγκατεστημένο πρόγραμμα αν συμβούν ανεπιθύμητα πράγματα
   - αν τα τρέχοντα πράγματα του MMU χρησιμοποιούν μνήμη (χειριστής εξαιρέσεων, δέντρο μετάφρασης, ...) μέσα στη BaseMem του εγκατεστημένου προγράμματος, μπορεί να αποτύχει, γιατί η BaseMem θα επανεγγραφεί κατά τη διάρκεια εκτέλεσης του εγκατεστημένου προγράμματος (προσωρινά)
   - γενικά κάθε πρόγραμμα που αλλάζει βασικές λειτουργίες του συστήματος (χρησιμοποιώντας το MMU) μπορεί να συγκρουστεί με το WHDLoad ...
2. απενεργοποίηση MMU:
   Σε αυτή τη κατάσταση, που είναι δυνατή μόνο σε 68030, το MMU θα απενεργοποιηθεί από το WHDLoad, κανένα χαρακτηριστικό σχετικό με το MMU δεν θα είναι διαθέσιμο.
3. χρήση MMU:
   Σε αυτή τη κατάσταση το WHDLoad παίρνει το πλήρη έλεγχο του MMU και πραγματοποιεί προστασία μνήμης και διαχείριση cache όπως εξηγείται παραπάνω.

Στον 68030 η προεπιλεγμένη κατάσταση είναι απενεργοποίηση MMU. Στον 68040/68060 η προεπιλογή είναι χρήση MMU. Υπάρχουν δύο επιλογές για τον έλεγχο αυτής της συμπεριφοράς. MMU/S αναγκάζει το WHDLoad να χρησιμοποιήσει το MMU και απαιτείται σε συστήματα με 68030 για να ενεργοποιηθούν όλα τα χαρακτηριστικά του MMU. NoMMU/S απενεργοποιεί τη χρήση του MMU από το WHDLoad (αγνόηση MMU).

Ένα Enforcer hit είναι ένα Enforcer hit, τέλος. (Michael Sinz)