2016-08-01 51 views

Antwort

2

Ein LDT ist optional. Ein IDT ist ein Schutzmodus-Äquivalent für einen Real-Mode IVT und erfüllt den gleichen Zweck. Es beschreibt Einstiegspunkte in ISRs und Exception-Handler. Sie benötigen ein IDT, um Hardware- und Software-Interrupts und Exceptions bedienen zu können. Wenn Sie ohne diese leben können, müssen Sie kein IDT einrichten.

Das Umschalten in den geschützten Modus erfordert etwas mehr als nur das Einrichten einer GDT und das Ausführen von LGDT. Sie müssen CR0-Bit 0 auf 1 ändern, einen Sprung ausführen, Segmentregister laden (vorzugsweise alle, um Probleme mit nicht initialisierten Segmentregistern während der verschiedenen Kontextwechsel zu vermeiden), wobei Selektoren auf die entsprechenden GDT-Einträge zeigen.

Real-Modus-Code kann im geschützten Modus (außer für den virtuellen 8086-Modus) normalerweise nicht ausgeführt werden, da Real-Modus-Werte in Segmentregistern im geschützten Modus und Segment: Offset-Adressen nicht funktionieren werden im geschützten Modus unterschiedlich in physikalische Adressen übersetzt (siehe GDT und Seitenübersetzung). IOW, das Hinzufügen von 1 zu dem Wert in einem Segmentregister hat nicht mehr den Effekt, 16 zu der resultierenden physikalischen Adresse hinzuzufügen. Außerdem können Sie kein Segment haben, das gleichzeitig lesbar, beschreibbar und ausführbar ist.

Theoretisch könnten Sie GDT- und/oder LDT-Deskriptoren so einrichten, dass ein Selektor N einen Deskriptor für ein 64 KB-Segment mit der Basisadresse N * 16 auswählt. In der Praxis ist es ein Kludschlamm. Borland hat dieses Schema jedoch in seinem Borland Pascal 7 implementiert, sodass Sie Programme im geschützten Modus schreiben können, ähnlich wie Sie sie für den Real-Modus schreiben würden.

+0

Bitte erläutern Sie das Segment: Offset-Übersetzung im geschützten Modus? –

+3

@PantherCoder Obligatorisches Lesen: Intel® 64 und IA-32 Architectures Software-Entwicklerhandbuch, vol. 3 "System Programming Guide", Kapitel 2 - 5 und rund. –

+0

Ja, normalerweise würden sie den Prozessor im 16-Bit-geschützten Modus verwenden. Bei einigen früheren Betriebssystemen und Umgebungen wurde der Speicherzugriffsfehler angezeigt. Der Fehlerbehandler würde eine Reihe von Deskriptoreinträgen generieren, um die Ausführung der Anweisung zu ermöglichen, und anschließend bei der Anweisung, die den Fehler verursacht hat, neu starten. Häufig würden Sie den Befehl LOADALL verwenden, um die versteckten Deskriptoreinträge direkt zu laden. Natürlich gab es viele Fallstricke - ein Betriebssystem und ein Protected-Mode-Programm laufen nicht zusammen, wenn sich einige ihrer Deskriptoren überlappen, wenn Sie möchten, dass das Betriebssystem und das Programm gleichzeitig laufen. –