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
    - Videos
 
  Übungen
    - UnivIS-Infos
    - Inhalt
    - Module
    - 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 2011/12  >  Betriebssysteme  >  Übungen  >  Aufgaben  >  Aufgabe 2

Externe Interrupts in modernen PCs - Interruptbehandlung mit Hilfe der APIC-Architektur

Moderne PCs verwenden nicht mehr den PIC8259A, um externe Interrupts an die CPU anzubinden. Stattdessen kommt der APIC zum Einsatz. Die APIC-Architektur besteht dabei aus mehreren Chips:
  • Jede CPU besitzt einen Local APIC, der Interruptanforderungen von au├čen entgegennimmt und an den CPU-Kern weiterleitet. In Multiprozessorsystemen ist es dar├╝berhinaus auch m├Âglich anderen CPUs einen Interprozessorinterrupt zu schicken und so zwischen den einzelnen CPUs zu kommunizieren.
  • Externe Interruptquellen wie z.B. Tastatur, Maus, Timer etc. sind an den sog. IO-APIC angeschlossen. Dieser besitzt daf├╝r 24 Eing├Ąnge. Alle Interrupteingangspins am IO-APIC sind grunds├Ątzlich gleichberechtigt. Der IO-APIC reagiert in FIFO-Reihenfolge auf mehrere externe Interrupts.

Alle APICs eines Systems (egal ob local oder IO-APIC) kommunizieren je nach System mittels des Systembusses oder ├╝ber einen dedizierten APIC-Bus. F├╝r den Systemprogrammierer(also euch:) ) spielt das jedoch keine Rolle, da sich beide Implementierungen auf Ebene der Schnittstelle gleich verhalten.

Die Zuordnung von externen Interrupts zu Interruptvektoren in der CPU ist im IO-APIC frei programmierbar. Dazu besitzt der IO-APIC eine Tabelle (Redirection Table), in der f├╝r jeden Eingangspin der in der CPU auszul├Âsende Interruptvektor konfiguriert werden kann. Dar├╝berhinaus ist es hier m├Âglich die Art des externen Interrupts (edge- oder leveltriggered) zu konfigurieren und ihn auszumaskieren. Auch die Menge aller zur Interruptbearbeitung in Frage kommenden Prozessoren kann hier konfiguriert werden.

Stellt der IO-APIC nun fest, dass auf einem der Interrupteing├Ąnge eine Interruptanforderung anliegt, so wird anhand der jeweiligen Konfiguration entschieden, an welche CPU der konfigurierte Interruptvektor gesendet werden soll. Dieser wird dann durch den Local APIC der jeweiligen CPU an den eigentlichen Prozessorkern weitergeleitet, wo dann die Unterbrechungsbehandlung gestartet wird. Nach Durchf├╝hrung der Behandlung muss dem Local APIC dies mitgeteilt werden. Erst wenn dies geschehen ist, wird man weitere Interruptanforderungen dieses Typs erhalten.

Im Gegensatz um IO-APIC nimmt der Local APIC nun eine Priorisierung vor. Die Priorit├Ąt eines Interrupts h├Ąngt dabei von seiner Vektornummer ab:

priority = vector / 16

Da die Vektoren 0 bis 31 reserviert sind, stehen die Priorit├Ąten 2 bis 15 der Anwendung zur Verf├╝gung.

Software

Ignorieren eines Interrupts

CPU-seitig kann daf├╝r gesorgt werden, da├č das laufende Programm nicht durch Interrupts unterbrochen wird. Dazu wird mit der Assembleranweisung cli das Interrupt-Bit im EFLAGS-Register gel├Âscht. Der Prozessor wird nun auf weitere, durch den Local APIC zugestellte Interrupts nicht mehr reagieren. Mit dem Befehl sti werden die Interrupts im Prozessorkern wieder zugelassen.

Externe Interrupts k├Ânnen auch selektiv unterdr├╝ckt werden. Dazu mu├č der IO-APIC programmiert werden. Da das APIC Subsystem eine relativ neue PC-Komponente ist, wird die Programmierung nicht ├╝ber die in und out Befehle der x86 CPU vorgenommen. Stattdessen werden die Register des Local und IO-APICs memorymapped angesprochen.

Software zur Interruptbehandlung

Wenn eine Interruptanforderung eines externen Ger├Ątes ankommt dann verzweigt der Prozessor automatisch zur entsprechenden Interruptbehandlungsroutine.

Deren Adresse wird einer Interruptdeskriptortabelle (IDT) entnommen, wobei die im IO-APIC konfigurierte Vektornummer als Index in die Tabelle dient. Die Vektornummer wird dabei vom IO-APIC ├╝ber den APIC-Bus oder den Systembus an einen Local APIC geschickt, der dann daf├╝r sorgt, dass die CPU unterbrochen wird. W├Ąhrend beim 8086 Prozessor die Lage der Interruptdeskriptortabelle noch fest von der Hardware vorgegeben war, wird beim 80386 ihr Anfang und ihre Gr├Â├če durch das IDT-Register beschrieben.

Die Interruptdeskriptortabelle kann maximal 256 Interruptgate-Deskriptoren enthalten, von denen es drei verschiedene Typen gibt:

Task-Gate

Der Interruptgate-Deskriptor zeigt auf einen Task, einen hardwarem├Ą├čig unterst├╝tzten Proze├č. Wenn der entsprechende Interrupt eintritt, f├╝hrt der Prozessor automatisch einen Taskwechsel zu dem angegebenen Interrupt-Task durch.

Interrupt-Gate

Der Interruptgate-Deskriptor zeigt auf eine Prozedur, die als Interruptbehandlungsroutine ohne vorherigen Taskwechsel aufgerufen wird. W├Ąhrend der Behandlungsroutine werden die Interrupts von der CPU automatisch deaktiviert.

Trap-Gate

Der Trapgate-Deskriptor zeigt auf eine Prozedur, die als Trapbehandlungsroutine ohne vorherigen Taskwechsel aufgerufen wird. Die Interrupts bleiben hier jedoch im Gegensatz zum Interruptgate aktiv.

Bevor der Prozessor infolge eines Interrupts oder Traps die angegebene Behandlungsroutine aufruft, legt er den aktuellen Inhalt des EFLAGS Registers auf den Stack ab. Dies erm├Âglicht es ihm, nun das Interrupt-Enable-Flag im EFLAGS-Register zu l├Âschen und auf diese Weise die geschachtelte Behandlung weiterer Interrupts zu verhindern. Wie bei einem normalen Funktionsaufruf wird dann noch die R├╝cksprungadresse (Inhalt von Code-Segment und Instruction Pointer) auf dem Stack gesichert, bevor die Behandlungsroutine begonnen wird. Bei manchen Exceptions legt der Prozessor zus├Ątzlich einen Fehlercode auf dem Stack ab.

Wurde die Unterbrechung durch einen Interrupt ausgel├Âst, so besteht eine Aufgabe der Interruptbehandlungsroutine darin, dem Local APIC mitzuteilen, dass der Interrupt behandelt wurde. Anderenfalls wird der APIC n├Ąmlich keine weiteren Interrupts desselben Ger├Ątes weiterleiten. Das Senden des Interrupt-Acknowledge-Signals erfolgt dabei durch schreiben in ein spezielles Register des Local APICs.

Mit dem iret Befehl wird die Unterbrechungsbehandlung abgeschlossen. Der Prozessor holt die R├╝cksprungadresse vom Stack, stellt den Inhalt des EFLAGS Registers wieder her und kehrt zu der unterbrochenen Funktion zur├╝ck. Dadurch, da├č auch die EFLAGS wieder hergestellt werden, werden sp├Ątestens jetzt die Interrupts CPU-seitig wieder zugelassen.

Zugriff auf die Register des Local APICs bzw. des IO-APICs.

Beide Komponenten, Local APIC und IO-APIC, werden grunds├Ątzlich ├╝ber memory-mapped IO angesprochen. In der Art und Weise wie jedoch die internen Register angesprochen werden unterscheiden sich jedoch beide grunds├Ątzlich. Beim Local APIC sind alle internen Register in den Adressraum des Prozessors eingeblendet. Die internen Register des IO-APICs sind hingegen nicht direkt zugreifbar, sondern werden ├╝ber die die beiden Register IOREGSEL und IOWIN angesprochen. Dazu schreibt man zuerst die Adresse des gew├╝nschen internen Registers in IOREGSEL. Aus IOWIN kann man nun den Wert des internen Registers auslesen oder neu schreiben.

Die Register des IO-APICs und ihre Beschreibung findet ihr in machine/ioapic_registers.h; f├╝r den Local APIC befinden sich diese in machine/lapic_registers.h

Die Lowlevelprogrammierung des Local APICs haben wir f├╝r euch schon erledigt. Ihr k├Ânnt also einfach die Klasse LAPIC verwenden, wenn ihr Funktionen des Local APICs ben├Âtigt. Der die Zugriffsfunktionen f├╝r den IO-APIC hingegen m├╝ssen von euch noch programmiert werden, indem ihr die Klasse IOAPIC vervollst├Ąndigt.

Literatur

  Impressum Stand: 2011-11-09 10:41   BO, DL