Betriebssystemtheorie/ Hardwaregrundlagen
Aus Wikibooks
| ACHTUNG: Dieser Artikel bedarf dringend einer Überarbeitung oder Erweiterung. Wenn du Lust hast, beteilige dich daran! |
Inhaltsverzeichnis |
[Bearbeiten] Die Von-Neumann-Architektur
Wenn man erstmal vor der Frage steht was ein Betriebssystem auszeichnet, dann lässt sich diese nicht ohne weiteres beantworten. Was sind die Aufgaben des Betriebssystems? Und welche Aufgaben sollte man eher den Anwendungsprogrammen überlassen. Dazu sollte man sich zuerst einmal die nahezu allen Rechnern zugrunde liegende Von Neumann-Architektur ansehen. ( siehe Bild rechts )
Demnach besteht ein Rechner, bzw. ein Rechensystem grob gesehen aus einen Prozessor (CPU), einem Speicher und Ein- und Ausgabe-Geräten. Verbunden sind diese Komponenten über den Systembus. Die erste Aufgabe eines Betriebsystems ist es also, diese sogenannten Betriebsmittel zu verwalten und dem Nutzer bereitzustellen.
Die Von-Neumann-Architektur ist nur eines von vielen Modellen für Computersysteme. Rechner, die nach anderen Modellen, wie der Harvard-Architektur oder dem Prinzip von Vektorrechnern, funktionieren, benötigen natürlich auch ein Betriebssystem.
Begriffsklärungen in der Wikipedia: Von-Neumann-Architektur, CPU, Betriebsmittel
[Bearbeiten] Speichertrennung
Die erste benötigte Eigenschaft der Hardware ist die Speichertrennung. Hierbei muss es möglich sein, den physisch vorhandenen Arbeitsspeicher in disjukte Teile zu zerlegen, wobei jedes ausgeführte Programm nur seinen Teil sieht. Jeder dieser Teile bildet einen virtuellen Speicheradressraum. Das einzige Programm, welches alle virtuellen Addressräme verwaltet und kontrolliert ist das Betriebssystem.
Diese Eigenschaft ist notwendig um zuverlässig verfügbare Systeme zu bauen.
[Bearbeiten] Eingeschränkter CPU-Modus
Eine CPU muss mindestens zwei Modi zur Verfügung stellen: einen Kernmodus, in dem alle Operationen ausgeführt werden dürfen und einen eingeschränkten Benutzermodus.
Der Kern des Betriebssystems läuft im Kernmodus. Er darf alle Prozessoranweisungen ausführen und auf alle Hardwaregeräte zugreifen.
Die Anwendungsprogramme werden im Benutzermodus ausgeführt. Dieser bringt einige Einschränkungen mit sich, um den sicheren Betrieb zu gewährleisten. Generell sind keine Aktionen gestattet, die den Zustand anderer Prozesse direkt beeinflussen können, so zum Beispiel:
- Keine Umschaltung zu anderen Prozessen, sogenannte Kontextwechsel
- Keine Änderungen am virtuellen Speicheraddressraum, weder am eigenen, noch am Addressraum anderer Prozesse
- Vor allem kein An- oder Abschalten der Interrupts
- Keine Änderungen an Interrupttabellen
- Keine Ausführung privilegierter Prozessorinstruktionen
[Bearbeiten] Wechsel zwischen den Prozessormodi
[Bearbeiten] Syscalls
Viele Programme müssen einige dieser Punkte verletzen, um ihre Aufgaben erfüllen zu können. Zwei Beispiele: Ein Gerätetreiber, der im Benutzermodus läuft, muss auf ein Hardwaregerät zugreifen. Wenn ein Programm einem anderen eine Nachricht senden will, muss es in dessen virtuellen Adressraum schreiben. Das Betriebssystem stellt dafür einen Mechanismus namens Syscalls zur Verfügung.
Durch Syscalls können Programme dem Kern mitteilen, welche Aktion sie durchführen wollen. Empfängt der Kern eine Mitteilung, führt er die gestellte Aufgabe wenn möglich aus.
[Bearbeiten] Grundlegende Funktionsweise
Zum Bauen von Syscalls benötigt man die zwei Prozessorinstruktionen syscall und sysret mit denen der Prozessormodus gewechselt werden kann.
Der Programmierer des Betriebssystems legt fest, welche Syscalls das Betriebssystem den Anwendungen anbieten soll. Jeder Syscall wird nun durch eine Nummer, die Parameter, die er übernimmt, und die Resultate, die er zurückgibt, definiert.
Ein Aufruf eines Syscalls läuft folgendermaßen ab:
- Die Parameter werden an definierte Stellen geschrieben, zum Beispiel auf den Stapel oder in festgelegte Prozessorregister.
- Die Nummer des Syscalls wird an eine definierte Stelle geschrieben.
- Die Anwendung ruft syscall auf. Es folgt ein Kerneintritt. Der Prozessor befindet sich nun im Kernmodus. Der Aufruf von syscall setzt den Instruktionszeiger des Prozessors auf eine Speicheradresse, die vorher vom Betriebssystem festgelegt wurde. An dieser Adresse befindet sich die Kernroutine, welche die Syscalls behandelt. Diese Routine wird von nun an ausgeführt.
- Der Kern liest die Nummer des Syscalls aus. Aus der Nummer kann die Anzahl und Position der Parameter im Speicher bestimmt werden. Falls sich diese Daten auf dem Stapel befinden, werden sie entfernt, da es sonst über kurz oder lang zu einem Stapelüberlauf kommen würde.
- Nun wird die gewünschte Funktion ausgeführt.
- Hinterläßt die Funktion einen Rückgabewert oder einen Fehler, wird dieser wiederum an eine definierte Stelle im Speicher geschrieben.
- Der Kern ruft nun sysret auf. Es kommt zum Kernaustritt. Der Prozessor wechselt in den Benutzermodus. Die Anwendung wird an der Stelle fortgesetzt, an der sie vorher unterbrochen wurde.
- Zum Abschluß des Syscalls muss die Anwendung nun noch den Rückgabewert auslesen und überprüfen, ob die gewünschte Operation erfolgreich war.