Im Real Mode war die Ermittlung einer linearen Speicheradresse ganz einfach: Der Wert des entsprechenden Segments wurde mit 16 multipliziert zum Offset addiert. Im Protected Mode ist das ganze erheblich umfangreicher. Es laufen folgende Schritte ab:
. Anhand des Segmentselektors im entsprechenden Segmentregister wird ermittelt, ob die globale oder die lokale Deskriptortabelle benutzt werden soll;
. Mit Hilfe des Speicherverwaltungsregisters GDTR oder LDTR wird die Basisadresse der globalen bzw. lokalen Deskriptortabelle ermittelt;
. Der Index des Segmentselektors wird mit 8 multipliziert, das Ergebnis zur Basisadresse der Deskriptortabelle addiert und es wird ermittelt, ob der so erhaltene Wert das Limit nicht übersteigt; tut er das, so löst der Prozessor die Exception 0dh "allgemeiner Protection-Fehler" aus.
. Anhand des Segmentdeskriptors in der Deskriptortabelle werden Basisadresse und Limit des Segments ermittelt;
. Im Adreßaddierer in der Adressierungseinheit werden diese Basisadresse und der Offset addiert und es wird ermittelt, ob der erhaltene Wert das Limit des betreffenden Segments nicht übersteigt; ist dies der Fall, so löst der Prozessor die Exception 0dh "allgemeiner Protection-Fehler" aus.
. Die so ermittelte Adresse wird als lineare (ohne Paging als physikalische) Adresse ausgegeben.
|