Dockers DEV Site


Updates · Faq · Home 

6.2 Probleme

Task-Wechsel über Interrupts und IRET

Wird die Task-Umschaltung wie oben erläutert durchgeführt, tritt ein Problem auf, das mit dem Task-Wechsel durch einen Interrupt zusammenhängt. Ein Interrupt-Gate unterbricht einen Task nur temporär. Das heißt, das "Busy-Bit" im unterbrochenen Task bleibt bestehen, das Back-Link Feld im TSS des neuen Tasks bekommt den Wert des Selektors des unterbrochenen TSS zugewiesen und das Bit NT (Nested Task) im EFLAGS-Register wird gesetzt. All das sind Voraussetzungen, um den neuen Task normalerweise mit IRET beenden zu können. Das eigentliche Problem besteht nun darin, daß der Prozessor beim Versuch, einen bereits als "Busy" gekennzeichneten Task erneut aufzurufen, eine Exception auslöst (das darf auch nicht möglich sein, da Tasks nicht reentrant sind).

Wird ein Task also ein zweites Mal durch den Task-Handler aktiviert, ohne daß vorher das Busy-Bit des jeweiligen Tasks gelöscht wurde, wird eine Exception ausgelöst. Der Task-Handler muß zur Lösung dieses Problems in die Task-Verkettung eingreifen. Dabei müssen die folgenden drei Tätigkeiten durchgeführt werden:

Erst dann kann über IRET zurückgekehrt werden.

Hardware-Interrupts

Eine Besonderheit von Hardware-Interrupts ist es, daß der Interrupt-Controller von ihrer Beendigung in Kenntnis gesetzt werden muß, da er sonst keine weiteren Interrupts generiert. Im Normalfall übernehmen die entsprechenden Standard Hardware-Interrupt Handler diese Aufgabe. Da dieser Standard Interrupt Handler vom Task-Handler ersetzt wurde, muß dieser Handler auch das sogenannte EOI-Signal (End Of Interrupt) an den Interrupt-Controller senden. Dazu muß das Kommandobyte 020h an den ersten Interrupt-Controller (Portadresse 020h) oder den zweiten Controller (Portadresse 0A0h) gesendet werden, je nachdem, welcher Controller den Interrupt ausgelöst hat. Die Quelle für den Hardware-Interrupt 0 ist der erste Controller, demnach muß auch der erste Controller das EOI-Signal erhalten:

; sende EOI an ersten Interrupt-Controller
		mov al,020h
		out 020h,al

Anmerkung: Das EOI-Signal darf nicht nur vor dem IRET-Kommando stehen, sondern muß auch vor jeder Task-Umschaltung gesendet werden (also vor dem entsprechendem JMP FAR Befehl). Geschieht das nicht, wird der entsprechende Task "für immer" ausgeführt, ohne daß er vom Timer-Interrupt und damit durch den Task-Handler unterbrochen wird.

Index
weiter >>
<< zurück ||

Last change 27/11/2022 by Docker Rocker.
This page uses no cookies, no tracking - just HTML.
Author: "Docker Rocker" ~ 2022 · [Public Git]