3.4.5.1 Blockorientierte Geräte

[gesichtete Version][gesichtete Version]
Keine Bearbeitungszusammenfassung
 
(61 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
=Blockorientierte Geräte=
 
<loop_index>Gerät, blockorientiert|Blockorientiertes Gerät|block device|Datenblock</loop_index>
<loop_index id="5fa9784ad3786">Gerät, blockorientiert</loop_index><loop_index id="5fa9784bf1f53">Blockorientiertes Gerät</loop_index><loop_index id="5fa9784bf1f5e">block device</loop_index><loop_index id="5fa9784bf1f67">Datenblock</loop_index>
<p>
<p>
Blockorientierte Geräte übertragen Daten jeweils in Blöcken. Dies gilt sowohl beim Lesen von diesem Gerät, als auch beim Schreiben auf selbiges. Typische Blockgrößen liegen zwischen 512 und 32&nbsp;768 Byte. Jeder Datenblock ist direkt adressierbar.
Blockorientierte Geräte übertragen Daten jeweils in kompletten Blöcken. Dies gilt sowohl beim Lesen von diesem Gerät, als auch beim Schreiben auf selbiges. Typische Blockgrößen liegen zwischen 512 und 32&nbsp;768 Byte. Jeder Datenblock ist direkt adressierbar.
</p>
</p>


Zeile 23: Zeile 23:
<p>
<p>
Es können also immer nur '''komplette''' Datenblöcke (<math>\rightarrow</math> in diesem Beispiel 512 Byte) gelesen oder geschrieben werden.
Es können also immer nur '''komplette''' Datenblöcke (<math>\rightarrow</math> in diesem Beispiel 512 Byte) gelesen oder geschrieben werden.
</p>
<p>
Der betreffende Datenblock wird direkt adressiert (<math>\rightarrow</math> Nr. 723).
</p>
</p>
</loop_area>
</loop_area>
Zeile 32: Zeile 35:
Die Geräteverwaltung definiert üblicherweise eine Standardschnittstelle, welche die Treiber aller blockorientierten Geräte unterstützen müssen. Darin vorgesehen sind beispielsweise Funktionen für
Die Geräteverwaltung definiert üblicherweise eine Standardschnittstelle, welche die Treiber aller blockorientierten Geräte unterstützen müssen. Darin vorgesehen sind beispielsweise Funktionen für
* die Initialisierung des Geräts,
* die Initialisierung des Geräts,
* das Lesen eines Blocks vom Gerät, sowie
* das Lesen der Daten des adressierten Blocks vom Gerät,
* das Schreiben eines Block zum Gerät.
* das Schreiben der Daten des adressierten Blocks zum Gerät, sowie
* die Behandlung eines vom Geräte-Controller ausgelösten Interrupts.
</p>
<p>
Diese Funktionen werden [[Bereitstellen einer Schnittstelle zur Geräteverwaltung|vom Gerätetreiber implementiert]].
</p>
 
<br />
== Zusammenarbeit von Treiber und Geräteverwaltung ==
 
<p>
Ist ein blockorientiertes Gerät am System angeschlossen, so wird sein Treiber (z.B. beim Systemstart) in den Hauptspeicher geladen. Der Treiber implementiert (u.a.) die Funktionen
* initDevice(),
* readBlock(),
* writeBlock(), sowie
* handleInterrupt().
</p>
<p>
Durch das Laden des Treibers in den Hauptspeicher steht ab diesem Moment fest, ab welcher Adresse im Hauptspeicher der ausführbare Code der genannten Funktionen beginnt. Dies gilt für jeden geladenen Treiber, also für jedes unterstützte Gerät.
</p>
 
<br />
== Beispiel für Festplatte und Brenner ==
<loop_area type="example">
<p>
Zum Beispiel für die Festplatte
* ab Adresse 2&nbsp;048 &nbsp; <math>\rightarrow</math> &nbsp; initDevice()
* ab Adresse 2&nbsp;560 &nbsp; <math>\rightarrow</math> &nbsp; readBlock()
* ab Adresse 3&nbsp;072 &nbsp; <math>\rightarrow</math> &nbsp; writeBlock()
* ab Adresse 4&nbsp;096 &nbsp; <math>\rightarrow</math> &nbsp; handleInterrupt()
</p>
<p>
und für den DVD-Brenner
* ab Adresse 6&nbsp;144 &nbsp; <math>\rightarrow</math> &nbsp; initDevice()
* ab Adresse 7&nbsp;168 &nbsp; <math>\rightarrow</math> &nbsp; readBlock()
* ab Adresse 7&nbsp;680 &nbsp; <math>\rightarrow</math> &nbsp; writeBlock()
* ab Adresse 8&nbsp;704 &nbsp; <math>\rightarrow</math> &nbsp; handleInterrupt()
</p>
<p>
und so fort für jeden weiteren Treiber eines blockorientierten Geräts.
</p>
</loop_area>
 
<br />
<p>
Die Geräteverwaltung wird über die Startadressen der implementierten Funktionen informiert und verwaltet diese entsprechend für alle unterstützten blockorientierten Geräte. Ab diesem Moment steht das Gerät für die Nutzung durch die Geräteverwaltung, durch das Betriebssystem und/oder einen Prozess zur Verfügung.
</p>
 
<br />
== Ein Praxisbeispiel ==
<loop_area type="practice">
<p>
Eine etwas vereinfachte Darstellung für einen Prozess A, der Daten in eine (bereits geöffnete) Datei auf der Festplatte schreiben möchte:
</p>
* Der Prozess A verfügt über die zu schreibenden Daten.
* Der Prozess A informiert das Betriebssystem über seinen Schreibwunsch.
* Das Betriebssystem leitet den Schreibauftrag an die Geräteverwaltung weiter.
* Die Geräteverwaltung identifiziert die Festplatte als gewünschtes Gerät und sorgt dafür, dass Adresse 3&nbsp;072 (siehe [[Blockorientierte_Geräte#Beispiel_für_Festplatte_und_Brenner|Beispiel oben]]) in den Programmzähler der CPU geladen wird.
* Die CPU beginnt mit der Ausführung des vom Treiber bereitgestellten Maschinencodes der writeBlock()-Funktion:
** Der betreffende Block auf der Festplatte wird identifiziert (ggf. auch nacheinander mehrere Blöcke)
** Die Daten des betreffenden Blocks werden von der Festplatte geladen.
** Die geladenen Daten des Blocks werden entsprechend des Schreibwunsches des Prozesses A verändert.
** Die veränderten Daten des Blocks werden zurück auf die Festplatte geschrieben.
** Die Treiberfunktion ist nun erfolgreich abgearbeitet, es erfolgt ein Rücksprung zur Geräteverwaltung.
* Die Geräteverwaltung informiert das Betriebssystem über die erfolgreiche Abarbeitung des Schreibauftrags.
* Das Betriebssystem informiert den Prozess A über die erfolgreiche Ausführung seines Schreibwunsches.
</loop_area>
 
<br />
 
== Aufgabe 1 ==
<loop_area type="task">
<loop_task title="Systemaufruf im Praxisbeispiel" id="5fa9784ad3793">
<p>
An welcher Stelle oder an welchen Stellen im [[Blockorientierte_Geräte#Ein_Praxisbeispiel|Praxisbeispiel]] kommt es zu einem [[Kernel-Mode,_User-Mode_und_Systemaufrufe#Definition:_Systemaufruf|Systemaufruf]]?
</p>
</p>
</loop_task>
</loop_area>
<br />
== Aufgabe 2 ==
<loop_area type="task">
<loop_task title="Prozesszustände im Praxisbeispiel" id="5fa9784ad379e">
<p>
An welcher Stelle oder an welchen Stellen im [[Blockorientierte_Geräte#Ein_Praxisbeispiel|Praxisbeispiel]] kommt es zu einem [[Prozesszustände|Zustandswechsel]] für den betreffenden Prozess A?
</p>
* Von welchem [[Prozesszustände|Zustand]] in welchen anderen [[Prozesszustände|Zustand]] erfolg der jeweilige Welchsel?
* Wer oder was führt den Zustandswechsel jeweils durch?
* Wo verwaltet das Betriebssystem die Information, in welchem [[Prozesszustände|Zustand]] sich der Prozess A gerade befindet?
</loop_task>
</loop_area>
<br />
== Aufgabe 3 ==
<loop_area type="task">
<loop_task title="Interrupt im Praxisbeispiel" id="5fa9784ad37a8">
<p>
An welcher Stelle oder an welchen Stellen im [[Blockorientierte_Geräte#Ein_Praxisbeispiel|Praxisbeispiel]] kommt es zu einem [[Datentransfer_und_Interrupts|Interrupt]]?
</p>
<p>
Und welcher Prozess wird auf der CPU kurz vor bzw. kurz nach dem [[Datentransfer_und_Interrupts|Interrupt]] ausgeführt?
</p>
<small><p>
Du kannst für deine Antwort ausgehen von:
* Außer Prozess A existiert noch mindestens ein weiterer Prozess B.
* Die Prozesse A und B sind voneinander unabhängig.
* Das Betriebssystem arbeitet mit [[Round Robin]] beim Scheduling.
* Es interessieren nur diejenigen Interrupts, an denen Prozess A "irgendwie" beteiligt ist. Alle sonstigen Interrupts, die für Prozess A keine Bedeutung haben, können im Rahmen dieser Aufgabe ignoriert werden.
</p></small>
</loop_task>
</loop_area>
<br />
== Aufgabe 4 ==
<loop_area type="task">
<loop_task title="Just a simple assembler instruction" id="5fa9784ad37b2">
<p>
Im [[Blockorientierte_Geräte#Ein_Praxisbeispiel|Praxisbeispiel]] ist zu lesen: Die Geräteverwaltung "''sorgt dafür, dass Adresse 3&nbsp;072 <small>(...)</small> in den Programmzähler der CPU geladen wird.''"
</p>
<p>
Welchen Assemblerbefehl nutzt die Geräteverwaltung für das Überschreiben des Wertes im Programmzähler der CPU?<br />
<small>Orientiere dich an der bereits bekannten ''simple machine language'' auf dieser Seite:<br />http://courses.cs.vt.edu/csonline/MachineArchitecture/Lessons/CPU/Lesson.html</small>
</p>
<p>
Und was passiert dann auf der CPU direkt nachdem dieser Assemblerbefehl ausgeführt wurde? <small>(In der nächsten Fetch-Phase.)</small>
</p>
</loop_task>
</loop_area>
<br />
== Aufgabe 5 ==
<loop_area type="task">
<loop_task title="CPU-Registerinhalte sichern im Praxisbeispiel" id="5fa9784ad37bb">
<p>
An welcher Stelle oder an welchen Stellen im [[Blockorientierte_Geräte#Ein_Praxisbeispiel|Praxisbeispiel]] müssen Inhalte von CPU-Registern gesichert werden?
</p>
</loop_task>
</loop_area>


<div class="autoit_do_not_print">
<div class="autoit_do_not_print">

Aktuelle Version vom 10. November 2020, 14:01 Uhr

Blockorientierte Geräte übertragen Daten jeweils in kompletten Blöcken. Dies gilt sowohl beim Lesen von diesem Gerät, als auch beim Schreiben auf selbiges. Typische Blockgrößen liegen zwischen 512 und 32 768 Byte. Jeder Datenblock ist direkt adressierbar.

Beispiele für blockorientierte Geräte sind:

  • Festplatte
  • CD- oder DVD-Laufwerk
  • Bandlaufwerk


Beispiel

Eine Festplatte arbeite mit einer Blockgröße von 512 Byte. In Datenblock Nr. 723 soll das fünfte Byte geändert werden. Der folgende Ablauf ist dafür nötig:

  • Lade Datenblock Nr. 723 von der Festplatte.
  • Ändere das fünfte Byte wie gewünscht.
  • Schreibe Datenblock Nr. 723 zurück auf die Festplatte.

Es können also immer nur komplette Datenblöcke ( in diesem Beispiel 512 Byte) gelesen oder geschrieben werden.

Der betreffende Datenblock wird direkt adressiert ( Nr. 723).


Schnittstelle für blockorientierte Geräte

Die Geräteverwaltung definiert üblicherweise eine Standardschnittstelle, welche die Treiber aller blockorientierten Geräte unterstützen müssen. Darin vorgesehen sind beispielsweise Funktionen für

  • die Initialisierung des Geräts,
  • das Lesen der Daten des adressierten Blocks vom Gerät,
  • das Schreiben der Daten des adressierten Blocks zum Gerät, sowie
  • die Behandlung eines vom Geräte-Controller ausgelösten Interrupts.

Diese Funktionen werden vom Gerätetreiber implementiert.


Zusammenarbeit von Treiber und Geräteverwaltung

Ist ein blockorientiertes Gerät am System angeschlossen, so wird sein Treiber (z.B. beim Systemstart) in den Hauptspeicher geladen. Der Treiber implementiert (u.a.) die Funktionen

  • initDevice(),
  • readBlock(),
  • writeBlock(), sowie
  • handleInterrupt().

Durch das Laden des Treibers in den Hauptspeicher steht ab diesem Moment fest, ab welcher Adresse im Hauptspeicher der ausführbare Code der genannten Funktionen beginnt. Dies gilt für jeden geladenen Treiber, also für jedes unterstützte Gerät.


Beispiel für Festplatte und Brenner

Beispiel

Zum Beispiel für die Festplatte

  • ab Adresse 2 048     initDevice()
  • ab Adresse 2 560     readBlock()
  • ab Adresse 3 072     writeBlock()
  • ab Adresse 4 096     handleInterrupt()

und für den DVD-Brenner

  • ab Adresse 6 144     initDevice()
  • ab Adresse 7 168     readBlock()
  • ab Adresse 7 680     writeBlock()
  • ab Adresse 8 704     handleInterrupt()

und so fort für jeden weiteren Treiber eines blockorientierten Geräts.


Die Geräteverwaltung wird über die Startadressen der implementierten Funktionen informiert und verwaltet diese entsprechend für alle unterstützten blockorientierten Geräte. Ab diesem Moment steht das Gerät für die Nutzung durch die Geräteverwaltung, durch das Betriebssystem und/oder einen Prozess zur Verfügung.


Ein Praxisbeispiel

Aus der Praxis

Eine etwas vereinfachte Darstellung für einen Prozess A, der Daten in eine (bereits geöffnete) Datei auf der Festplatte schreiben möchte:

  • Der Prozess A verfügt über die zu schreibenden Daten.
  • Der Prozess A informiert das Betriebssystem über seinen Schreibwunsch.
  • Das Betriebssystem leitet den Schreibauftrag an die Geräteverwaltung weiter.
  • Die Geräteverwaltung identifiziert die Festplatte als gewünschtes Gerät und sorgt dafür, dass Adresse 3 072 (siehe Beispiel oben) in den Programmzähler der CPU geladen wird.
  • Die CPU beginnt mit der Ausführung des vom Treiber bereitgestellten Maschinencodes der writeBlock()-Funktion:
    • Der betreffende Block auf der Festplatte wird identifiziert (ggf. auch nacheinander mehrere Blöcke)
    • Die Daten des betreffenden Blocks werden von der Festplatte geladen.
    • Die geladenen Daten des Blocks werden entsprechend des Schreibwunsches des Prozesses A verändert.
    • Die veränderten Daten des Blocks werden zurück auf die Festplatte geschrieben.
    • Die Treiberfunktion ist nun erfolgreich abgearbeitet, es erfolgt ein Rücksprung zur Geräteverwaltung.
  • Die Geräteverwaltung informiert das Betriebssystem über die erfolgreiche Abarbeitung des Schreibauftrags.
  • Das Betriebssystem informiert den Prozess A über die erfolgreiche Ausführung seines Schreibwunsches.


Aufgabe 1

Aufgabe

An welcher Stelle oder an welchen Stellen im Praxisbeispiel kommt es zu einem Systemaufruf?


Aufgabe 2

Aufgabe

An welcher Stelle oder an welchen Stellen im Praxisbeispiel kommt es zu einem Zustandswechsel für den betreffenden Prozess A?

  • Von welchem Zustand in welchen anderen Zustand erfolg der jeweilige Welchsel?
  • Wer oder was führt den Zustandswechsel jeweils durch?
  • Wo verwaltet das Betriebssystem die Information, in welchem Zustand sich der Prozess A gerade befindet?


Aufgabe 3

Aufgabe

An welcher Stelle oder an welchen Stellen im Praxisbeispiel kommt es zu einem Interrupt?

Und welcher Prozess wird auf der CPU kurz vor bzw. kurz nach dem Interrupt ausgeführt?

Du kannst für deine Antwort ausgehen von:

  • Außer Prozess A existiert noch mindestens ein weiterer Prozess B.
  • Die Prozesse A und B sind voneinander unabhängig.
  • Das Betriebssystem arbeitet mit Round Robin beim Scheduling.
  • Es interessieren nur diejenigen Interrupts, an denen Prozess A "irgendwie" beteiligt ist. Alle sonstigen Interrupts, die für Prozess A keine Bedeutung haben, können im Rahmen dieser Aufgabe ignoriert werden.


Aufgabe 4

Aufgabe

Im Praxisbeispiel ist zu lesen: Die Geräteverwaltung "sorgt dafür, dass Adresse 3 072 (...) in den Programmzähler der CPU geladen wird."

Welchen Assemblerbefehl nutzt die Geräteverwaltung für das Überschreiben des Wertes im Programmzähler der CPU?
Orientiere dich an der bereits bekannten simple machine language auf dieser Seite:
http://courses.cs.vt.edu/csonline/MachineArchitecture/Lessons/CPU/Lesson.html

Und was passiert dann auf der CPU direkt nachdem dieser Assemblerbefehl ausgeführt wurde? (In der nächsten Fetch-Phase.)


Aufgabe 5

Aufgabe

An welcher Stelle oder an welchen Stellen im Praxisbeispiel müssen Inhalte von CPU-Registern gesichert werden?