Skip to main content.

Navigation:

Interruptbehandlung

Ziel

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