x86-Programmierung und -Betriebsarten (Teil 4)

Task-Gate

Woher "weiß" der Prozessor nun aber, wann er einen Task und welchen neuen er aktivieren soll, das heißt was bildet den Trigger für einen Task Switch?

Der Schlüssel liegt in den Task-Gates. Das Bild "Task-Gate-Deskriptor" zeigt den Aufbau eines solchen Task Gates. Beachten Sie, dass sich die Struktur der Task Gates zwischen 80286 und 80386 trotz des Übergangs von 16 auf 32 Bit im Gegensatz zu allen anderen Gates und Systemsegmenten nicht geändert hat.

Der TSS-Segmentselektor im Task-Gate weist auf den Segmentdeskriptor, der das TSS des neu zu aktivierenden Tasks definiert. Trifft der Prozessor bei einem CALL-Befehl, einem Sprungbefehl oder einem Interrupt auf ein solches Task-Gate, führt er einen solchen Task-Switch aus, indem er den gegenwärtigen Zustand des aktiven Tasks im TSS abspeichert, das durch das Task-Register TR (siehe Abbildung 6.8) definiert ist und dem Typfeld des zugehörigen TSS-Deskriptors den Wert 1 (80286-kompatibles TSS) oder 9 (80386-TSS) zuweist. Damit ist das TSS als verfügbares TSS gekennzeichnet. Anschließend lädt er den neuen TSS-Segmentselektor aus dem Task-Gate-Deskriptor in das TR und liest aus der LDT oder GDT (je nachdem, welche Tabelle der Segmentselektor im Task Gate referiert) Basisadresse, Limit und Zugriffsrechte des Task-Gate-Deskriptors.

Um den Task-Switch zu vollenden, kennzeichnet der Prozessor nun den zugehörigen TSS-Deskriptor im Typfeld als busy, das heißt er schreibt einen Wert 3 (80286-kompatibles TSS) oder 11 (80386-TSS) in dieses Feld. Zuletzt lädt er die im neuen TSS abgelegten Werte für die Segmente und Offsets in die entsprechenden Register. Das Registerpaar CS:EIP zeigt nun auf den Befehl des neu aktivierten Tasks, bei dem dieser zuvor unterbrochen worden ist; seine Ausführung wird also an der Unterbrechungsstelle erneut aufgenommen. Das Bild "Task-Switch" zeigt die vier Möglichkeiten, wie ein Task Switch ausgelöst werden kann, sowie die dazu vom Prozessor durchgeführten Prozesse.

Erstmals aktivierte Tasks - also Tasks, die neu geladen werden - aktiviert die CPU in gleicher Weise. Nur zeigt das Registerpaar CS:EIP hier nicht auf den Befehl an der Unterbrechungsstelle, sondern den Startbefehl des Programms.