Kapitel 2 - Interrupts und DMA
|
Inhalt
|
- 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)
|
|
|
|
|
| Kapitel 1 | Einleitung |
|
Befehlsschleife, Risc und Cisc...
|
| Kapitel 2 | Interrupts |
|
Interrupts, Polling, DMA...
|
| Kapitel 3 | Speicherschutz |
|
Segmentation, Paging, Mapping, Multitasking...
|
| Kapitel 4 | Caches |
|
Lokalität, Cache-Arten, Schreibstrategien...
|
| Kapitel 5 | Risc |
|
Risc-Architektur, Load/Store, Registerfenster...
|
| Kapitel 6 | Pipelining |
|
Prinzip, Datenkonflikte, Forwarding, Delayed Load
|
| Kapitel 7 | Branch Prediction |
|
Statische / Dynamische Brach-Prediction...
|
| Kapitel 8 | Superskalarität |
|
Out-Of-Order Execution, Scoreboard und Tomasulo, VLIW...
|
| Kapitel 9 | Parallelrechner |
|
SMP,Vektorrechner, Cache-Kohärenz
|
|
|
|
|
|
|
Quellen:
|
Andrew S. Tanenbaum
Computerarchitektur
|
Andrew S. Tanenbaum
Moderne Betriebssysteme
|
Petterson
Computer Architectur & Design
|
Christian Märtin
Rechnerarchitekturen
|
Rehm
Skript und Vorlesung
|
Word Wide Web
Verschiedenste Seiten
|
|
|
|
|
|
|