Interruptbehandlung
Ziel
- Behandlung asynchroner Ereignisse
- Problematik und Schutz kritischer Abschnitte
Aufgabe
Es soll eine einfache Interruptbehandlung für die Unterbrechungen durch
Tastaturereignisse umgesetzt werden. Hierzu müssen die Klassen
CPU
(ist in der Vorgabe enthalten), PIC
,
Plugbox
, Gate
, Panic
, Keyboard
sowie die Funktion guardian()
implementiert werden.
Um die entsprechenden Geräte überall in oo-StuBS nutzen
zu können, sollen von diesen Klassen die globale Objekte cpu
,
plugbox
, pic
und keyboard
angelegt werden.
Implementierung
Teil A
Im ersten Schritt sollte die Klasse PIC
implementiert werden.
Mit ihrer Hilfe und der Klasse CPU
können Unterbrechungen
von der Tastatur zugelassen werden (während des Boot-Vorgangs
werden alle Unterbrechungen bei der CPU und beim PIC ausmaskiert).
Nach der Implementierung des PIC
müsste automatisch bei
jedem Betätigen einer Taste die Funktion guardian()
aktiviert werden, da die Interruptvektortabelle im Startup-Code
entsprechend initialisiert wurde.
Mit einer Ausgabe in guardian()
kann Teil A dann
leicht getestet werden (zumindestens einige Male).
Hinweis: Da die Zeichen noch nicht vom Tastaturcontroller abgeholt werden, läuft der Tastaturpuffer irgendwann voll. Sobald dies geschehen ist, sendet der Tastaturcontroller keine Interrupts mehr. Deshalb kann es durchaus passieren, dass zunächst nur für ein oder zwei Tastendrücke Interrupts angezeigt werden.
Hinweis: Während der Bearbeitung einer Unterbrechung
muss sich nicht um unerwünschte Interrupts gekümmert werden.
Der Prozessor schaltet diese automatisch aus, wenn er mit der Behandlung
beginnt und lässt sie erst wieder zu, wenn die Unterbrechungsbehandlung
mit der Assembleranweisung iret
beendet wird (Das entspricht
der letzten schließenden Klammer der guardian()
Implementierung.).
Achtung: Die Interruptverarbeitung kann
natürlich nur funktionieren, wenn oo-StuBS auch läuft.
Sobald die main()
-Funktion verlassen wird, ist das Verhalten
beim Auftreten eines Interrupts undefiniert.
Ein Betriebssystem sollte halt nicht plötzlich enden :-)
Teil B
Im zweiten Schritt soll eine Infrastruktur geschaffen werden, die die
Behandlung von Unterbrechungen durch zugeordnete Gerätetreiberobjekte
ermöglicht.
Zur Verwaltung dieser Treiberobjekte dient dabei die Klasse Plugbox
,
die für jeden möglichen Interrupt einen Zeiger auf ein
Gate
-Objekt bereithält. Die abstrakte Klasse
Gate
beschreibt dazu die Schnittstelle aller Treiber, die
Interrupts behandeln.
Hinweis: Alle Zeiger der Plugbox
sollen
initial so gesetzt werden, dass sie auf ein globales Panic
-Objekt
verweisen.
Teil C
Im nächsten Schritt sollen Unterbrechungen, die von der Tastatur
ausgelöst werden, abgefangen und interpretiert werden. Als Ergebnis
soll nach jedem Tastendruck das entsprechende Zeichen an einer festen
Position auf dem Bildschirm dargestellt werden. Zusätzlich soll die
Tastenkombination Ctrl-Alt-Delete einen Reboot
auslösen. Hierzu soll die Klasse Keyboard
implementiert
werden, die den eigentlichen Tastaturtreiber darstellt.
Teil D
Abschließend soll ein Testprogramm in Application::action()
geschrieben werden, das aus main()
aufgerufenn wird und in
einer Endlosschleife Ausgaben an einer festen Position machen.
Durch das Drücken von Tasten sollte es mit Hilfe der von euch
implementierten Unterbrechungsbehandlung nun möglich sein, die Ausgabe
durcheinander bringen zu können. Überlegt wie dies
passiert, und versucht das Problem zu vermeiden.
Vorgabe
Die Implementierung der Klasse CPU
haben wir bereits für
euch übernommen (siehe zweite Vorgabe).
Für die eigentliche Tastaturabfrage könnt ihr die von euch
implementierte Klasse Keyboard_Controller
aus Aufgabe 1
wiederverwenden.
Hinweis: Die Vorgabe erhaltet ihr als Patch, diesen könnt
ihr mit dem Befehl patch -p1 --merge -i oostubs_task2.patch
einspielen
(Denkt bitte daran, dass der Befehl im SUN-Pool gpatch
heißt).
Hilfestellung
- Interrupt (wikipedia.org)
- Informationen zum Programmierbaren Interrupt Controller (PIC)
- I/O-Grundlagen