Χρησιμοποιώντας τις resload_Protect#?

Θεωρία

Υπάρχουν διάφορες περιπτώσεις στις οποίες ίσως είναι πολύ χρήσιμο να πληροφορείστε όταν το εγκατεστημένο πρόγραμμα έχει προσβάσεις σε συγκεκριμένες περιοχές μνήμης. Με τις συναρτήσεις resload_Protect#? είναι δυνατόν να προστατευτούν μερικές περιοχές μνήμης από ανάγνωση και/ή εγγραφή από τον επεξεργαστή. Προστασία σημαίνει ότι κάθε πρόσβαση σε τέτοια προστατευόμενη περιοχή θα δημιουργήσει μία εξαίρεση Access Fault που θα έχει σας αποτέλεσμα έναν αντίστοιχο επιλογέα από το WHDLoad. Αν ορίσετε μία περιοχή μνήμης ως προστατευόμενη χρησιμοποιώντας τη συνάρτηση resload_Protect#? το WHDLoad θα τροποποιήσει τις περιγραφές των επηρεαζόμενων σελίδων στο δέντρο μετάφρασης του MMU. Τώρα κάθε πρόσβαση στη προστατευόμενη σελίδα από το CPU θα δημιουργήσει μία εξαίρεση Access Fault. Ο χειριστής εξαιρέσεων μέσα στο WHDLoad θα επιβεβαιώση το λόγο για την εξαίρεση. Αν ο λόγος ήταν μία πρόσβαση σε προστατευμένη σελίδα αλλά η πρόσβαση δεν ταιριάζει με την προστατευόμενη περιοχή η πρόσβαση θα εξομοιωθεί, και θα συνεχιστή η κανονική εκτέλεση του προγράμματος. Διαφορετικά το WHDLoad θα τερματιστεί με έναν κατάλληλο επιλογέα. Αν η πρόσβαση ήταν μία πρόσβαση στη ροή εντολών (π.χ. το cpu προσπαθεί να φορτώσει κώδικα) θα εξομοιωθεί πάντα, ή με άλλα λόγια οι συναρτήσεις resload_Protect#? επηρεάζουν μόνο ανάγνωση και εγγραφή δεδομένων. Το γεγονός ότι κάθε πρόσβαση σε προστατευόμενη σελίδα (το μέγεθος σελίδας προς το παρόν είναι $1000) θα δημιουργήσει ένα σφάλμα πρόσβασης, ακόμα και αν η προστατευόμενη περιοχή έχει μήκος μόνο 1 byte, έχει ως αποτέλεσμα μια σημαντική καθυστέρηση της ταχύτητας εκτέλεσης του προγράμματος. Ειδικά αν κομμάτια του κώδικα βρίσκονται στην ίδια σελίδα. Αν το πρόγραμμα εξαρτάται από την ταχύτητα εκτέλεσης, είναι πιθανές οι διαφορές στην εκτέλεση. Οπότε είναι πιθανόν μερικά προγράμματα να μην λειτουργήσουν με το χαρακτηριστικό προστασίας.

Παράδειγμα: checksums πάνω σε κώδικα

Αν εγκαταστήσετε ένα παιχνίδι χρησιμοποιώντας το WHDLoad πρέπει να διορθώσετε τις αρχικές ρουτίνες του loader στο παιχνίδι με τέτοιο τρόπο ώστε να χρησιμοποιούν το WHDLoad για να φορτώσουν τα δεδομένα του παιχνιδιού. Μερικά παιχνίδια πραγματοποιούν checksums πάνω σε συγκεκριμένες περιοχές κώδικα για να ανακαλύψουν αν ο αυθεντικός κώδικας έχει αλλαχθεί. Αυτές οι ρουτίνες ελέγχου μπορεί μερικές φορές να είναι δυσεύρετες. Αλλά χρησιμοποιώντας τις συναρτήσεις resload_Protect#? στο WHDLoad τίποτα δεν είναι ποιό εύκολο από αυτό. Το μόνο που πρέπει να κάνετε είναι να προστατέψετε τα bytes που αλλάξατε στο κώδικα του παιχνιδιού από ανάγνωση. Τώρα κάθε ρουτίνα που προσπαθεί να κάνει ένα checksum και να διαβάσει το διορθωμένο κώδικά σας θα προκαλέσει ένα σφάλμα πρόσβασης. Και θα ξέρετε που βρίσκεται η ρουτίνα.

Περιορισμοί

Δεν πρέπει να προστατέψετε τη σελίδα μνήμης στην οποία δείχνει το SSP. Αν το κάνετε, και παρουσιαστεί μία Εξαίρεση, θα έχει ως αποτέλεσμα ένα Double Bus Fault γιατί το CPU δεν θα μπορεί να γράψει το stackframe εξαιρέσεων. Μετά από ένα Double Bus Fault μόνο ένα reset μπορεί να συνεχίσει την εκτέλεση. Το WHDLoad ελέγχει για σύγκρουση των προστατευόμενων περιοχών με το SSP και τερματίζεται αν υπάρξει, αλλά αυτό δεν θα βοηθήσει αν το SSP αλλάξει μετά.