Friedrich-Alexander-Universität Univis FAU-Logo
Techn. Fakultät Willkommen am Department Informatik FAU-Logo
Logo IMMD
Lehrstuhl für Informatik 4
Betriebssysteme
Department Informatik  >  Informatik 4  >  Lehre  >  WS 2003/04  >  Betriebssysteme

Aufgabe 2: Interruptbehandlung für OO-Stubs

Lernziel

  • Behandlung asynchroner Ereignisse
  • Problematik und Schutz kritischer Abschnitte

Aufgabenbeschreibung

Es soll eine einfache Interruptbehandlung für die Unterbrechungen durch die Tastatur vorgesehen werden.

Hierzu müssen die Klassen PIC, Plugbox, Gate, Panic, Keyboard sowie die Funktion guardian implementiert werden. Die Klasse CPU, ist in der Vorgabe enthalten.

Um die entsprechenden Geräte überall in OO-Stubs nutzen zu können, sollen von den Klassen CPU, Plugbox, PIC und Keyboard globale Objekte cpu, plugbox, pic und keyboard angelegt werden.

Implementierungshinweise

Teil a

Im ersten Schritt sollte die Klasse PIC implementiert werden. Mit ihrer Hilfe und mit Hilfe der Klasse CPU können Unterbrechungen von der Tastatur zugelassen werden (während des Boot-Vorgangs wurden bei der CPU und beim PIC alle Unterbrechungen ausmaskiert). Wenn dies funktioniert, müsste automatisch bei jedem Drücken und Loslossen einer Taste die Funktion guardian aktiviert werden, da die Interruptvektortabelle im Startup-Code entsprechend initialisiert wurde. Mit einer Ausgabe in guardian() kann Teil a leicht getestet werden - zumindestens einige Male. Wenn die Zeichen nicht vom Tastaturcontroller abgeholt werden, läuft der Tastaturpuffer irgendwann voll. Sobald der Puffer voll ist, sendet der Tastaturcontroller jedoch keine Interrupts mehr. Deshalb kann es durchaus passieren, dass ihr zunächst nur für ein oder zwei Tastendrücke Interrupts bekommt. Denkt außerdem auch an das ACK Signal für den PIC.

Tipps:

  • Während der Behandlung einer Unterbrechung braucht ihr euch um unerwünschte Interrupts nicht zu sorgen. Der Prozessor schaltet diese nämlich 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.
  • Eure Interruptverarbeitung kann natürlich nur funktionieren, wenn OOSTUBS auch läuft. Sobald OOSTUBS die main()-Funktion verlässt, ist das Verhalten bei Auftreten eines Interrupts undefiniert. Ein Betriebssystem sollte halt nicht plötzlich enden :-)

Teil b

Im zweiten Schritt wird eine Infrastruktur geschaffen, um die Unterbrechungsbehandlung an ein zugeordnetes Gerätetreiberobjekt weiterzuleiten. Zur Verwaltung von Treiberobjekten dient die Klasse Plugbox, die für jeden möglichen Interrupt einen Zeiger auf ein Gate Objekt bereithält. Gate ist eine abstrakte Klasse, die die Schnittstelle aller Interrupt-behandelnden Treiber beschreibt. Initial werden alle Zeiger der Plugbox so gesetzt, dass sie auf ein globales Panic Objekt verweisen.

Teil c

Hier soll die Klasse Keyboard implementiert werden. Sie stellt den eigentlichen Tastaturtreiber dar. Die Unterbrechungen, die die Tastatur auslöst, müssen abgefangen und interpretiert werden. Als Ergebnis soll nach jedem Tastendruck das entsprechende Zeichen an einer festen Position auf dem Bildschirm dargestellt werden. Die Tastenkombination "Ctrl-Alt-Delete" soll ein Reboot auslösen.

Teil d

Schreibt ein Testprogramm in Application::action(), das von main() aus aufgerufenn wird. Dieses soll in einer Endlosschleife an einer festen Position Ausgaben machen. Es sollte nun möglich sein, durch das Drücken von Tasten die Ausgabe "durcheinander" bringen zu können. Überlegt euch, was dabei passiert, und vermeidet das Problem mit Hilfe der Funktionen der Klasse CPU.

Vorgaben

Die Implementierung der Klasse CPU haben wir bereits für euch übernommen. Für die eigentliche Tastaturabfrage könnt die eure Klasse Keyboard_Controller aus Aufgabe 1 wiederverwenden.

Hilfestellung



  Impressum   Datenschutz Stand: 2003-11-26 17:19   OS