Friedrich-Alexander-Universität UnivisSuche FAU-Logo
Techn. Fakultńt Willkommen am Department Informatik FAU-Logo
Logo I4
Lehrstuhl für Informatik 4
Betriebssysteme
 
  Vorlesung
    - UnivIS-Infos
    - Inhalt
    - Folien
 
  Übungen
    - UnivIS-Infos
    - Inhalt
    - Mailingliste
    - Ergänzendes Material
    - Terminübersicht
    - Aufgaben
       * Umgebung
       * Typische Fehler
       * Aufgabe 1
          Dokumentation
       * Aufgabe 2
          Dokumentation
       * Aufgabe 3
          Dokumentation
       * Aufgabe 4
          Dokumentation
       * Aufgabe 5
          Dokumentation
       * Aufgabe 6
          Dokumentation
       * Aufgabe 7
          Dokumentation
 
  Evaluation
Department Informatik  >  Informatik 4  >  Lehre  >  WS 2010/11  >  Betriebssysteme  >  ├ťbungen  >  Aufgaben  >  Aufgabe 2

Aufgabe 2: Interruptbehandlung f├╝r OOStuBS/MPStuBS

Lernziele

  • 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 IOAPIC, Plugbox, Gate, Panic, Keyboard sowie die Funktion guardian() implementiert werden. Die Klassen CPU und LAPIC sind in der Vorgabe enthalten.

Um die entsprechenden Ger├Ąte ├╝berall in OOStuBS/MPStuBS nutzen zu k├Ânnen, sollen von den Klassen CPU, Plugbox, IOAPIC und Keyboard globale Instanzen der Objekte namens cpu, plugbox, ioapic und keyboard angelegt werden. Ein globales Objekt lapic der Klasse LAPIC exisiert schon, da dieses w├Ąhrend des Startupvorganges ben├Âtigt wird (wenn man dieses benutzen m├Âchte, reicht also eine extern Deklaration des Objekts).

a2.dot

Klassen├╝bersicht f├╝r Aufgabe 2

Implementierungshinweise

Teil A

Im ersten Schritt sollte die Klasse IOAPIC implementiert werden. Mit Hilfe der Klassen IOAPIC, LAPIC und CPU k├Ânnen Unterbrechungen von der Tastatur zugelassen und behandelt werden (w├Ąhrend des Boot-Vorgangs wurden bei der CPU und beim I/O-APIC 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 Aufgabenteil 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.

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/MPStuBS auch l├Ąuft. Sobald OOStuBS/MPStuBS die main()-Funktion verl├Ąsst, ist das Verhalten bei Auftreten eines Interrupts undefiniert. Ein Betriebssystem sollte halt nicht pl├Âtzlich enden :). Explizit f├╝r MPStuBS gilt dies auch f├╝r die main_ap() Funktion, die von den Applikationsprozessoren ausgef├╝hrt wird.
  • In einem modernen PC geschiet die Interruptverarbeitung durch ein Zusammenspiel des I/O-APICs, an welchen die externen Ger├Ąte angeschlossen sind, mit den in jeder CPU integrierten Local APICs. Um euch das Leben zu vereinfachen, ist die Implementierung der Klasse LAPIC(Local APIC) in der Vorgabe enthalten. Dar├╝berhinaus sorgt der Startupcode daf├╝r, dass der Local APIC in einem definierten Zustand ist, so dass bei korrekter Implementierung der IOAPIC-Klasse die Interruptbehandlung funktionieren m├╝sste.
  • Laut Spezifikation des Local APICs ist es notwendig die Bearbeitung eines jeden Interrupts zu best├Ątigen. Dies ist durch Aufruf der Methode LAPIC::ackIRQ(), die schon in der Vorgabe enthalten ist, m├Âglich.

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 einen Reboot ausl├Âsen.

Teil D

In Teil D soll das Testprogramm an die Interruptverarbeitung angepasst werden.

OOStuBS

Schreibt ein Testprogramm in Application::action(), das von main() aus aufgerufen wird. Dieses soll in einer Endlosschleife an einer festen Position Ausgaben mit Hilfe des kout Objekts 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, warum es passiert, und vermeidet das Problem mit Hilfe der Methoden der Klasse CPU.

MPStuBS

In MPStuBS sollen im Hauptprogramm aller CPUs Ausgaben an verschiedenen Stellen des Bildschirms mit Hilfe des globalen kout Objekts durchgef├╝hrt werden. Hier braucht man nichteinmal Interrupts, um die Ausgabe durcheinanderzubrigen (Warum?). Zur Vermeidung des Problems reichen die Methoden der Klasse CPU alleine nicht aus. Deshalb soll hier noch zus├Ątzlich die Klasse Spinlock implementiert werden, um parallele Kontrollfl├╝sse zu synchronisieren. Was muss bei der Verwendung des Spinlocks beachtet werden? Welche Probleme k├Ânnen dabei auftreten?

Vorgaben

Die Implementierung der Klassen CPU und LAPIC haben wir bereits f├╝r euch ├╝bernommen. F├╝r die eigentliche Tastaturabfrage k├Ânnt ihr eure Klasse Keyboard_Controller aus Aufgabe 1 wiederverwenden.

Hilfestellung

Externe Interrupts in modernen PCs - Interruptbehandlung mit Hilfe der APIC-Architektur
  Impressum Stand: 2010-11-17 18:51   BO, DL