Kapitel 2 - Interrupts und DMA
- Was sind Software Interrupts?
- Wie arbeitet Polling?
- Die Interrupt-Befehlsschleife
- Vergleich DMA und Interrupts
- Memory-Mapped I/O und getrennter Adressraum
- Adressierungsarten
|
Klassifizieren Sie die verschiedenen Unterbrechungen!

Wenn in der Literatur von Interrupts gesprochen wird, so werden oft externe,
asynchrone Interrupts gemeint, welche meistens in Zusammenhang mit E/A-Geräten
auftreten.
Wie arbeiten Traps (Fangstellen?)
Traps sind eine Art automatische Prozeduraufrufe, welche durch eine vom
Programm verursachte Bedingung eingeleitet werden. Solch eine Bedingung kann z.B.
Gleitkommaüberlauf, Schutzverletzung oder Stapelüberlauf. Findet ein Überlauf
statt, so stoppt die Ablaufsteuerung die Ausführung und holt von einer bestimmten
Stelle im Speicher die Adresse des Trap-Handlers (Prozedur), mit der dann der
Programmcounter überschrieben wird.
Wesentliches Merkmal eines Traps ist, daß es durch Ausnahmebedingungen ausgelöst
wird, welche durch Hardware oder Mikroprogramme erkannt werden.
Wie arbeiten Interrupts
Interrupts sind Unterbrechungen der Ablaufsteuerung. Wie es für Traps
Trap-Handler gibt, gibt es für Interrupts Interrupt-Handler. Nach Abarbeitung des
Interrupt-Handlers wird die Kontrolle wieder an das Programm zurückgegeben. Der
interne Zustand des Prozessors (IP, Register, ...) muss nun exakt wiederhergestellt
werden.
Der Unterschied zwischen Traps und Interrupts ist nun, daß Traps synchron mit dem
ausgeführten Programm laufen. Deshalb werden sie auch erst nach der
Befehlsausführung erkannt und ausgeführt. Asynchrone Interrupts sind dagegen
unabhängig vom gerade ausgeführten Programm.
Interrupt’s stammen von echten physikalischen INT-Quellen wie z.B. IRQ3 von COM1
kommt. Diese springen über ein Interrupt-Gate. Interrupt’s die per Software mit
INT-Befehl ausgelöst werden, springen über Trap-Gates! Wenn ein Interrupt ein
Interrupt-Gate durchläuft, wird das IF=0 automatisch gesetzt, d.h.
es gehen überhaupt keine Interrupts mehr durch. Asynchrone Interrupts können also
nicht unterbrochen werden. Trap-Gates dürfen unterbrochen werden, da sie nicht
zeitkritisch sind. Interrupt- und Trap-Gates führen nicht zu Taskwechsel über ein
TSS. Das retten der Register ist dem INT-Handler überlassen.
Was sind Software Interrupts?
Software-Interrupts werden von Programmen mit Hilfe von speziellen
Maschinenbefehlen aufgerufen. Dabei müssen diese nur eine Nummer für das benötigte
Interrupt kennen. Über diese Nummer wird in der
Interrupt-Vektor-Tabelle die Adresse des Interrupt-Unterprogrammes
(ISR) referenziert und ausgeführt.
Was versteht man unter internen und externen Interrupts?
Externe Interrupts sind asynchron, wie nichtvektorisierte und
vektorisierte Interrupts. Interne sind synchron, wie Software
Interrupts oder Exection-Traps (Reaktionen auf interne Fehler wie FPU-Errors oder
Page-Faults).
Was ist Polling?
Polling ist das zyklische Abfragen von einen oder mehreren
E/A-Devices zur Feststellung der Kommunikationsbereitschaft bzw. zum Einholen von
Kommunikationswünschen.
|
Vorteile des Pollings
|
Nachteile des Pollings
|
|
Einfach zu Implementieren
|
Hoher Programm-Overhead
|
|
Kommunikationsanforderungen erfolgen synchron zum Programmablauf
|
Die meisten Anfragen an die Geräte sind unnötig
|
|
Je mehr Geräte am Bus hängen, um so mehr steigt Reaktionszeit.
|
Priorisierung bei zeitgleichen Anfragen erfordert zusätzlichen Zeitaufwand
|
Aufgrund der vielen Nachteile sollte besser eine asynchrone Kommunikation
mit den Geräten durch die Hardware unterstützt werden (Interrupts).
Erklären Sie das Interrupt Prinzip

Es kann auch über eine Art "hardware-gestütztes Polling" über spezielle
Interrupt-Signalleitungen eine Kommunikationsanforderung festgestellt werden. Dazu
muss aber die Befehlsverarbeitungschleife um eine Unterbrechungsanfrage erweitert
werden.
Erklären Sie den Unterschied zwischen vektorisierten und nichtvektorisierten
Interrupts!
Man unterscheidet vektorisierten und nichtvektorisierten Interrupt. Bei
nichtvektorisierten Interrupts wird dem Interruptsignal eine feste
Adresse zugeordnet. Bei vektorisierten Interrupts wird
dynamisch eine wahlfreie Adresse zugeordnet, welche durch die CPU
über ein definiertes Protokoll vom Datenbus gelesen wird.
Was passiert beim Auftreten eines Interrupts?
1. Sperren weiterer Unterbrechungen mit gleicher oder geringerer
Priotität
- Unterbrechungen mit höherer Wichtigkeit dürfen normalerweise solche mit
geringerer Wichtigkeit wieder unterbrechen
2. Rettung wichtiger Register-Informationen
(Prozessorstatus)
- alle Prozessor-Register retten, die durch die Interruptbehandlung
überschrieben würden
- heute gibt es dafür spezielle Maschinenbefehle
3. Bestimmen der Interruptquelle (durch Hardware
realisiert)
4. Laden des zugehörigen Interruptvektors
- d.h. das Herstellen des Anfangszustandes für gewählte Interruptroutine
5. Abarbeitung der Interruptroutine
- Retten weiterer Zustandsinformationen, sofern nicht durch Hardware realisiert
- meistens Übernahme weiterer Parameter von definierten Stellen (bei
Systemaufruf Ruf-Nr. und weitere Parameter oder bei Geräte-Interrupt
Gerätestatusbits wie E/A Fortschritt, Fehler etc.)
- eigentliche Behandlung des Interrupts, z.B. Setzen eines Flags (z.B. bei
Gleitkommaüberlauf oder Aufruf zum Rückpositionieren und erneutem Lesen bei
Lesefehler bei Magnetbandkassette (komplizierterer Fall)
6. Rückkehr zur unterbrochenen Aufgabe entweder
- Rückspeichern der geretteten Registerinformationen, d.h. Wiederherstellen des
Prozessorzustandes
oder
- Bearbeitung einer neuen Aufgabe, z.B. bei Uhrinterrupt nach Ablauf einer
Zeitscheibe
oder
- Zustand "HALT" nach schwerem Fehler, z.B. Spannungsausfall (abort)
Welche beiden Zustandssicherungskonzepte gibt es
totale Sicherung aller bislang nicht automatisch gesicherten
Register
- der CPU-Status des unterbrochenen Programms wird komplett eingefroren
- auch die invarianten Anteile werden gesichert, der Programmzustand ist damit
leicht zugreifbar
- weit verbreitet bei Allzweckbetriebssystemen (z.B. UNIX & Co.)
partielle Sicherung der im weiteren Verlauf nicht gesicherten
Register
- der CPU-Status des unterbrochenen Programms wird teilweise eingefroren
- es wird nur der wirklich von Änderungen betroffene Anteil gesichert
- der Programmzustand ist damit nicht leicht zugreifbar
- weit verbreitet bei Spezialzweckbetriebssystemen
Was stellt das Hauptproblem bei Interrupts dar
Interrupts verhalten sich nicht deterministisch. D.h. ihre Abarbeitungszeit
variiert. Sie sollte trotzdem so gering wie möglich gehalten werden.
Warum wird DMA oft Interrupts vorgezogen?
Zwar befreien Interrupts die Prozessoren vom Warten auf E/A Ereignisse, aber
vektorisierte Interrupts benötigen viele Taktzyklen zu ihrer Abarbeitung. Dieser
Overhead steigt natürlich, um so weniger Datenmengen bei einer Interruptauslösung
übertragen werden. Interrupts werden erst nach der Befehlsabarbeitung erkannt und
ausgeführt. Dies ist ein Problem bei Echtzeitanwendungen, da sich diese Verzögerung
negativ auswirken kann. Außerdem kommt es durch Interrupts bei
Instruction-Set-Parallismus oft zu Pipeline-Neustarts.
Die Lösung dieser Probleme wäre ein direkter Speicherzugriff eines
Devices, da so der Prozessor komplett umgangen werden kann.
Wie kann DMA implementiert werden?
Zentral:
Ein zentraler DMA-Controller steht allen Geräten zu Verfügung.
Dezentral:
Jede E/A-Einheit hat ihren eigenen DMA-Controller implementiert und kann selbst
Busmaster werden
Probleme bei DMA treten vor allem durch ihre Unabhängigkeit und die dadurch
notwendigen Schutzmaßnahmen auf. Ein DMA-Controller wirkt wie ein weiterer
Prozessor am Bus. Um Inkonsistenzen im Speicher zu vermeiden, muss ein
DMA-Controller eng mit dem Speichermanagment des Systems zusammenarbeiten.
Was ist Memory-Mapped I/O?
Ein I/O Controller besteht aus einer Vielzahl von Registern, welche auf zwei
Varianten adressiert werden können:
Memory-Mapped I/O, um den konventionellen Adressraum verschiedenen
I/O-Devices zuzuordnen oder Getrennten I/O Adressraum, bei dem auf
einer speziellen Adressleitung die E/A-Adresse auf den Bus gelegt wird.
(veraltete Variante)
Was ist eine Task?
Ein Task ist ein eigenständiges Programm / Prozess von vielen im
Multitasksystem. Es wird von einem TSS (Task State Segment)
beschrieben. Bei einem Taskwechsel werden alle Informationen in diesem TSS
gespeichert. Jeder TSS-Deskriptor steht in der GDT. Die GDT hat
beim i486 8192 Einträge, jedoch ist der 0. Eintrag immer leer. Somit sind maximal
8191 verschiedene Prozesse möglich (inclusive des Betriebssystems).
Wie werden Task-Wechsel realisiert?
Ein Taskwechsel geschieht durch Auswahl eines Task-Gates aus Globaler
Deskriptor Tabelle (Task State Segment = TSS). Ein TSS Enthält alle Informationen,
die einen Task ausmachen:
- verwendete Prozessor-Register
- LDT-Selektor (einer Pro Task) welche die Segment-Deskriptoren des Prozesses
enthält
- Stack-Segment-Pointer
- Verwaltungsinformation
- Adresse der Paging-Tabellen
- I/O-Map Base Adresse
- Busy-Bit, definiert den aktuell rechnenden Task (genau einer im System)
TR (Task Register)
- enthält den aktuellen TSS (Selektor des Descriptors des aktuellen TSS)
- TSS-Descriptoren nur in GDT!
Bsp: Scheduler als Task ( Umschalter )
Umschalten durch jeweiligen Austausch des Back-Link, IRETD zum anderen Task, z.B.
Timer-Interrupt-Task.
Welche Möglichkeiten für Privilegwechsel gibt es?
- CALL in eine Prozedur mit anderen Privilegde-Level (CALL-Gate)
- JMP in eine Prozedur mit anderen Privi legde-Level (TASK-Gate)
- INT (TRAP-Gate)
- TASK-Gate durch erzwungenen Prozeßwechsel
- IRET Rücksprung aus INT-Handler
Was ist der Unterschied zwischen einem Selektor und einem Deskriptor?
Ein Selektor Segment-Register wählt einen Deskriptor in (GLI)DT aus, ein
Deskriptor Eintrag in (GLI)DT, beschreibt das Segment.
Weshalb ist es sinnvoll, dass ein TSS-Descriptor nur in der GDT stehen darf?
Es soll verhindert werden, daß ein USER-Programm in einen anderen Task
springt. Da Taskwechsel nur über TASK-Gates erfolgen (dieses zeigt auf einen
TSS-Deskriptor) muß der CurrentPrivilegdeLevel (CPL vom CS:) numerisch kleiner
sein, als das des geforderten TSS-Deskriptor (DPL) bzw. kleiner als der (RPL) des
Segments wo sich der TSS-Deskriptor aufhält. Damit wird sichergestellt, daß der
Taskwechsel nur von "höherem" Code (OS) aus ausgeführt werden kann. Würde ein
TSS-Deskriptor in der LDT stehen, könnte es dort mit einem höheren RPL versehen
werden, und der USER-Code könnte sich zum OS-CODE etablieren!
Welche Grundtypen von Deskriptoren gibt es?
|
IDT
|
LDT
|
GDT
|
|
CODE-Segment
DATA-Segment
STACK-Segment
|
CODE-Segment
DATA-Segment
STACK-Segment
|
INT-Gate
TRAP-Gate
TASK-Gate
|
TASK-Gate
|
TASK-Gate
CALL-Gate
|
Welche grundlegenden Adressierungsarten gibt es?
- Unmittelbare Adressierung
- Direktadressierung (Direct Adressing)
- Registeradressierung
- Indirekte Registeradressierung
- Indizierte Adressierung
- Basisindizierte Adressierung
- Stapeladressierung
Unmittelbare Adressierung
- Der Adressteil der Instruktion enthält den Operanden selbst, anstatt eines
Verweises.
- Solche Operanden werden als Direktoperanden (Immediate) bezeichnet
- Bsp: MOV R4, 5H (5H wird direkt in R4 gespeichert)
Direktadressierung (Direct Adressing)
- Es wird eine volle Adresse des Operanden angegeben
- Deshalb nur für globale Variablen anwendbar, da Instruktion immer auf gleiche
Speicehrzeile zugreift
Registeradressierung
- Das gleiche Prinzip wie Direct Adressing, nur das Register anstelle von
Speicherzellen verwendet werden
- In Registern sollten die am häufigsten verwendeten Variablen abgelegt werden,
da Register vielfach schneller als Hauptspeicher sind
- Load/Store-Architekturen nutzen fast nur diesen Registermode (außer es muss
vom oder zum Speicher transferiert werden)
Indirekte Registeradressierung
- Die Adresse wird nicht direkt angegeben, sondern indirekt über ein Register
- Das Register enthält somit einen Pointer auf eine Speicherzelle
- Vorteil ist, daß auf Speicher referenziert werden kann, aber keine volle
Speicheradresse notwendig wird
Indizierte Adressierung
- Der Speicher wird durch Angabe eines Registers und eines konstanten Offsets
adressiert
- Häufig benutzt bei Arrayzugriffen, wie A = B[i] (MOV R1, B[R2])
Basisindizierte Adressierung
- Speicheradresse wird hier durch Addition zweier Register und einen optionalen
Offset berechnet
- Eines der Register stellt die Basis dar und ein anderes den Index
Stapeladressierung
- Hier ist gar keine Adressangabe notwendig
- Somit sind die Instruktionen sehr kurz
- Die Stapeladressierung arbeitet mit der umgekehrten polnischen Notation
(Postfix)
|
|
|
|
|