[gesichtete Version] | [gesichtete Version] |
Kwastg (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
|||
(3 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
<loop_index>Gerät, blockorientiert | <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 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. | 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. | ||
Zeile 108: | Zeile 108: | ||
== Aufgabe 1 == | == Aufgabe 1 == | ||
<loop_area type="task"> | <loop_area type="task"> | ||
<loop_task title="Systemaufruf im Praxisbeispiel"> | <loop_task title="Systemaufruf im Praxisbeispiel" id="5fa9784ad3793"> | ||
<p> | <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]]? | 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]]? | ||
Zeile 118: | Zeile 118: | ||
== Aufgabe 2 == | == Aufgabe 2 == | ||
<loop_area type="task"> | <loop_area type="task"> | ||
<loop_task title="Prozesszustände im Praxisbeispiel"> | <loop_task title="Prozesszustände im Praxisbeispiel" id="5fa9784ad379e"> | ||
<p> | <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? | 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? | ||
Zeile 132: | Zeile 132: | ||
== Aufgabe 3 == | == Aufgabe 3 == | ||
<loop_area type="task"> | <loop_area type="task"> | ||
<loop_task title="Interrupt im Praxisbeispiel"> | <loop_task title="Interrupt im Praxisbeispiel" id="5fa9784ad37a8"> | ||
<p> | <p> | ||
An welcher Stelle oder an welchen Stellen im [[Blockorientierte_Geräte#Ein_Praxisbeispiel|Praxisbeispiel]] kommt es zu einem [[Datentransfer_und_Interrupts|Interrupt]]? | An welcher Stelle oder an welchen Stellen im [[Blockorientierte_Geräte#Ein_Praxisbeispiel|Praxisbeispiel]] kommt es zu einem [[Datentransfer_und_Interrupts|Interrupt]]? | ||
Zeile 144: | Zeile 144: | ||
* Die Prozesse A und B sind voneinander unabhängig. | * Die Prozesse A und B sind voneinander unabhängig. | ||
* Das Betriebssystem arbeitet mit [[Round Robin]] beim Scheduling. | * Das Betriebssystem arbeitet mit [[Round Robin]] beim Scheduling. | ||
* Es interessieren nur diejenigen Interrupts, an denen Prozess A "irgendwie" beteiligt ist. Alle sonstigen | * 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> | </p></small> | ||
</loop_task> | </loop_task> | ||
Zeile 153: | Zeile 153: | ||
== Aufgabe 4 == | == Aufgabe 4 == | ||
<loop_area type="task"> | <loop_area type="task"> | ||
<loop_task title="Just a simple assembler instruction"> | <loop_task title="Just a simple assembler instruction" id="5fa9784ad37b2"> | ||
<p> | <p> | ||
Im [[Blockorientierte_Geräte#Ein_Praxisbeispiel|Praxisbeispiel]] ist zu lesen: Die Geräteverwaltung "''sorgt dafür, dass Adresse 3 072 <small>(...)</small> in den Programmzähler der CPU geladen wird.''" | Im [[Blockorientierte_Geräte#Ein_Praxisbeispiel|Praxisbeispiel]] ist zu lesen: Die Geräteverwaltung "''sorgt dafür, dass Adresse 3 072 <small>(...)</small> in den Programmzähler der CPU geladen wird.''" | ||
Zeile 171: | Zeile 171: | ||
== Aufgabe 5 == | == Aufgabe 5 == | ||
<loop_area type="task"> | <loop_area type="task"> | ||
<loop_task title="CPU-Registerinhalte sichern im Praxisbeispiel"> | <loop_task title="CPU-Registerinhalte sichern im Praxisbeispiel" id="5fa9784ad37bb"> | ||
<p> | <p> | ||
An welcher Stelle oder an welchen Stellen im [[Blockorientierte_Geräte#Ein_Praxisbeispiel|Praxisbeispiel]] müssen Inhalte von CPU-Registern gesichert werden? | An welcher Stelle oder an welchen Stellen im [[Blockorientierte_Geräte#Ein_Praxisbeispiel|Praxisbeispiel]] müssen Inhalte von CPU-Registern gesichert werden? |
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:
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:
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).
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
Diese Funktionen werden vom Gerätetreiber implementiert.
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
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.
Zum Beispiel für die Festplatte
und für den DVD-Brenner
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.
Eine etwas vereinfachte Darstellung für einen Prozess A, der Daten in eine (bereits geöffnete) Datei auf der Festplatte schreiben möchte:
An welcher Stelle oder an welchen Stellen im Praxisbeispiel kommt es zu einem Systemaufruf?
An welcher Stelle oder an welchen Stellen im Praxisbeispiel kommt es zu einem Zustandswechsel für den betreffenden Prozess A?
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:
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.)
An welcher Stelle oder an welchen Stellen im Praxisbeispiel müssen Inhalte von CPU-Registern gesichert werden?
Diese Seite steht unter der Creative Commons Namensnennung 3.0 Unported Lizenz http://i.creativecommons.org/l/by/3.0/80x15.png