Buffl

BS 1

CR
von Cha R.

Was ist ein Interrupt? Warum brauchen wir den Unterbrechungsmechanismus?

Dieses ist eine meist nichtdeterministische Unterbrechungsanforderung (Ausnahme hierbei: absichtlich ausgelöstesoftware traps“, sog. „system calls“, für beabsichtigte Betriebs-systemaufrufe zur Kontrollübergabe an das BS). Unvorhergesehen ausgelöste Software-Unterbrechungen („software interrupts“) wie z.B. die „Division durch Null“ oder ein „Page Fault“ werden als „exceptions“ oder als „Ausnahme“ bezeichnet. Des weiteren gibt es noch die klassischen „hardware interrupts“, welche nicht vom aktuell ausgeführten Programm, sondern von externen Ereignissen außerhalb der CPU ausgelöst werden. Die entsprechenden elektrischen Anforderungssignale dieser externen Ereignisse werden mit Hilfe einer zwischengeschalteten Hardware-Einheit, genannt „Interrupt-Controller“ priorisiert und bei bedarf an den Unterbrechungseingang der CPU weitergeleitet. Im speziellen können Interrupts auch zur Realisierung vom präemptiven (im Sinne von präventiv) Multitasking, also zum Erzwingen von Prozesskontext-Wechseln (um Kontrolle des BS zu erhalten) verwendet werden (Auch in einem Präemptiven-Multitasking-System sollten sich die Prozesse z.B. durch freiwilliges periodisches Wechseln von „rechnend“ nach „bereit“ kooperativ verhalten). Speziell bei Single-Core-Prozessoren können sogenannte „atomare Abschnitte“ durch idealerweise sehr kurz dauerndes Interrupt-Sperren (Maskierung) realisiert werden. Bevorzugt werden sollten jedoch spezielle atomare CPU-Instruktionen.

Was ist der Unterschied zwischen der „programmierten“ Ein-/Ausgabe und DMA?

Bei der unterbrechungsgesteuerten Ein-/Ausgabe enthält der Datenpuffer des Controllers im Extremfall jeweils nur ein Daten-Wort und löst für dessen Abholung eigens eine Unter-brechung aus. Das Umkopieren der Daten aus dem Controller-Puffer in den Hauptspeicher erfolgt dann in der InterruptServiceRoutine „programmatisch“ durch die CPU, wodurch insgesamt viel CPU-Rechenzeit verbraucht wird. Beim DMA-Datentransfer „Direkter Speicher-zugriff“ (direct memory access = DMA) übernimmt ein eigens auf Datentransfer optimierter Contro-ller das ereignisbasierte Kopieren von Daten aus z.B. einem Fest-platten-Controller in den Haupt-speicher oder umgekehrt. Der DMA-Controller kopiert also selbständig über den Bus Daten in den Hauptspeicher. Somit wird die CPU nicht mit dem eigentlichen Datentransport und auch nicht mit den für den Transport ggf. häufiger benötigten Interrupt-Behandlungen belastet. Jedoch sind CPU-Zugriffe auf den Bus während einer DMA-(Teilblock-)Übertragung nicht möglich. Außerdem muß z.B. der Festplatten-Controller mit dem DMA-Controller kompatibel sein, da beide über zpezielle Handshake-Leitungen miteinander verbunden sind. Zu Beginn eines z.B. Lese-Auftrages von der Festplatte teilt der Gerätetreiber dem Geräte-Controller über dessen Register die Nummer des zu lesenden Blocks mit und dem DMA-Controller die Anfangsadresse des Hauptspeicherbereichs, in den die Daten übertragen werden sollen. Danach kann sich die CPU anderen Aufgaben widmen. Liegen nun Daten im Platten-Controller vor, so wird dieses dem DMA-Controller signalisiert und dieser beginnt sofort mit dem Transfer der Daten in den Hauptspeicher, wobei die Hauptspeicheradressen jeweils entsprechend erhöht werden. Der Transfer kann in mehreren/vielen Blöcken erfolgen. Erst nach Beendigung des letzten Transfers, löst der DMA-Controller eine Unterbrechung für die CPU aus.



Wie wird der Schutz des Adressbereichs (Adressraums) eines Prozesses realisiert?

Ein Prozess soll nicht auf beliebige physikalische Adressen außerhalb seines Hauptspeicher-Bereiches (seines Adress-raums) zugreifen dürfen. Zugriffe auf Bus-Adressen außer-halb eines zusammenhängenden physikalischen Adress-raums lassen sich mit einer speziellen Hardware, die zwischen CPU-Kern (Speicheradressregister) und Adress-bus liegt, verhindern. Im Basisregister (base register) steht die niedrigste physikalische Adresse des „erlaubten“ Speicherbereichs, also sozusagen die physikalische Startadresse des Programms. Das Grenzregister (limit register) enthält die Länge des zusammenhängenden Programm-Adressbereichs. Die Inhalte von Basis- und Grenzregister können nur mit speziellen privilegierten Maschinenbefehlen verändert werden. Über das Grenzregister kann eine Überschreitung des erlaubten Adressbereichs erkannt und ggf. über ausgelöste Interrupts behandelt werden. Mit dem Basisregister erfolgt eine Umsetzung von segmentbezogenen „relativen Adressen“ auf physikalische absolute Bus-Adressen. Das Programm selbst ist also nicht direkt bezüglich seiner momentanen physikalische absoluten Adresse compiliert bzw. assembliert bzw. gebunden worden (welche zur Compile-Zeit auch noch nicht bekannt war), sondern relativ zur Adresse Null (Das Programm könnte also ohne die Schutzhardware im Adressbereich von Adresse Null direkt laufen, falls dort nicht schon z.B. die Interrupt-Tabelle liegen würde). Durch den „relativen“ Bezug zur Adresse Null werden derart compilierte bzw. gebundene Programme in Kombination mit dem Basisregister (dynamisch) „relokierbar“; d.h. den ausführbaren Programmcode kann der Loader in einen beliebigen Hauptspeicher-bereich platzieren, welcher gerade frei ist. Mithilfe der hardwaremäßigen Adressumsetzung „absolute physikalische“ BusAdresse = SegmentStartadresse (Basisregister) + relative Adresse (Speicheradressregister) liegt immer die passende absolute Adresse auf dem Adressbus. Für diese Flexibilität (Relokierbarkeit) muß man ggf. mit Performance (theoretisch bis Faktor 2) bezahlen, d.h. z.B. eine Schutz-Hardware (MMU) muß vorhanden sein, welche die Übersetzung der relativen Adresse in die absolute umsetzt.




Warum braucht das Betriebssystem einen Timer?

Er „wacht“ darüber, daß ein Prozess seine Zeitscheibe nicht überschreitet.

Wie funktioniert der Zugriff auf eine Festplatte? Was macht ein Programm, wenn es einen Block auf der Festplatte lesen möchte? Wie kommen die Daten aus dem Puffer des Gerätes in den Hauptspeicher?

Schon bei der Übersetzung des Programms wird der Hochsprachen-Befehl read durch einen entsprechenden Systemaufruf ersetzt, der den Ein-/Ausgabeteil des Betriebssystems startet. Wie wird eine read-Operation ausgeführt? (Am besten zeichnet man die Schichten des virtuellen Geräts, dann merkt man leicht die Schritte und die Aufgaben der einzelnen Schichten: Treiber, Controller, Gerät):

1. Eine Software-Unterbrechung (Trap) wird ausgelöst; der Kontext von P wird zunächst      gerettet, dann wird der geräteunabhängige Ein-/Ausgabeteil des Betriebssystems      aufgerufen.

2. Dieser prüft zunächst, ob die Parameter zulässig sind und ob die benötigten      Daten schon im Cache im Hauptspeicher stehen; in diesem Fall werden sie in den      Adressraum von P kopiert, und nach der Rückkehr von der Software-Unterbrechung      kann der Prozess P weiter rechnen.

3. Stehen die Daten nicht im Cache, ist ein Plattenzugriff erforderlich. Der Prozess P wird      deshalb in den Zustand blockiert versetzt. Der Leseauftrag wird an die Geräte-      Warteschlange des Plattenlaufwerks angehängt und der Gerätetreiber benachrichtigt.

4. Sobald der Gerätetreiberprozess rechnend wird, entnimmt er den Auftrag der Geräte-      Warteschlange. Der Gerätetreiber reserviert im betriebssystemeigenen Bereich     Speicherplatz für die zu lesenden Daten, bestimmt die gerätespezifische     Datenblockadresse etc. und überträgt einen Lesebefehl an den Gerätecontroller. Der     Treiber kann nun andere Aufgaben ausführen, er wird später informiert, wenn der     Lesebefehl ausgeführt worden ist, siehe Schritt 6.

5. Der Gerätecontroller bestimmt zuerst die physische Adresse, dann führt er den     Leseauftrag aus und überträgt zusammen mit dem DMA-Controller die Daten in den     reservierten Bereich im systemeigenen Speicher (der Adressraum eines inzwischen evtl.     ausgelagerten Prozesses steht nicht zur Verfügung). Währenddessen können auf der     CPU beliebige andere Prozesse rechnen. Nach dem Kopieren der Daten wird eine     DMA-Ende-Unterbrechung ausgelöst.

6. Bei der Unterbrechungsverarbeitung wird mittels des Unterbrechungsvektors die DMA-     Ausführungsende-Unterbrechungsroutine gestartet. Sie informiert den Gerätetreiber,     daß der Lesebefehl ausgeführt worden ist.

7. Sobald der Gerätetreiber diese Information empfängt, sieht er in der Gerätewarteschlange      nach, von welchem Prozess der Leseauftrag zu dieser Information stammt, und      informiert den geräteunabhängigen Ein-/Ausgabeteil des Betriebssystems.

8. Sobald der geräteunabhängige Ein-/Ausgabeteil des Betriebssystems die Information      empfängt kopiert er die Daten aus dem systemeigenen Speicher in den Adressraum      des Prozesses P und versetzt P in den Zustand bereit (z.B. via Signalisierung). Der      Systemaufruf ist damit erfolgreich bearbeitet worden.

9. Sobald der Prozess P wieder rechnen darf setzt er seine Arbeit hinter dem read fort.




Author

Cha R.

Informationen

Zuletzt geändert