Wenn es sich um ein Betriebssystem handelt, kommunizieren Programme nicht mit Gerätetreibern, zumindest nicht direkt. Programme sprechen mit Abstraktionen, die, ohne dass sie es merken, über eine oder mehrere Abstraktionsebenen mit Gerätetreibern kommunizieren.
Ich werde die Komplexität moderner Betriebssysteme und deren Verwendung überspringen als Beispiel CP / M verwenden , ein Mikrocomputer-Betriebssystem, das vor 45 Jahren entwickelt wurde. CP / M war ein Schichtkuchen mit drei Schichten:
Programm. Die oberste Ebene ist ein Programm , das etwas Nützliches (Textverarbeitung, Space Invaders spielen) durch Berechnen und E / A ausführt. Angenommen, das Programm möchte irgendwann den Buchstaben "A" anzeigen, damit der Benutzer ihn sehen kann. CP / M stellt eine als Konsole bekannte Abstraktion bereit , nach der der Benutzer, der mit dem Programm interagiert, suchen sollte. Die übliche Art, einen Charakter dorthin zu senden, ist mit ein paar Montageanweisungen:
LD C,2 ; Load 2 into register C
LD E,65 ; Load the ASCII code for 'A' into register E
CALL 5 ; Call CP/M's routine for getting things done
(Wenn Sie mit ihnen nicht vertraut sind, können Sie sich Register als Variablen vorstellen, die im Prozessor vorhanden sind.) Wir werden in einer Minute die magischen Zahlen 2
und deren Bedeutung kennen 5
. Das Wichtigste dabei ist, dass das Programm nur weiß, dass es eine Konsole gibt und dass es eine Möglichkeit gibt, darauf zu schreiben. Darüber hinaus weiß es nichts und kümmert sich auch nicht darum. Dies ist die erste von zwei Abstraktionen, die CP / M für die E / A verwendet.
BDOS . Die 5
vom Programm aufgerufene Adresse ist der Einstiegspunkt für die nächste Schicht, das Basic Disk Operating System oder BDOS . Das BDOS bietet eine ganze Reihe von nummerierten Funktionen , die einer Bestellung nach Nummer aus einem Restaurantmenü ähneln. Sie geben an, dass Sie eine Konsolenausgabe wünschen, indem Sie das C
Register mit der Funktionsnummer ( 2
für die Konsolenausgabe) und dem Symbol ladenE
Register mit dem zu sendenden Zeichen . Die Konsolenausgabe ist eine sehr einfache Operation, und das BDOS muss nur die nächste Ebene aufrufen.
BIOS. Das BIOS oder Basic Input / Output System ist die Schicht, in der der gesamte hardwarespezifische Code vorhanden ist. In modernen Systemen wird dies als eine Reihe von Gerätetreibern betrachtet. Wie das BDOS bietet das BIOS Aufrufe für einen Standardsatz sehr primitiver Vorgänge , mit denen das BDOS seine Geschäfte abwickelt. Eine dieser Operationen wird aufgerufenCONOUT
, das sich darum kümmert, dass der Charakter, den das Programm auffordert, zwei Ebenen darüber zu schreiben, auf die Hardware, die es macht. (Im Gegensatz zu PCs waren die Dinge damals nicht homogen. Jedes System hatte andere Möglichkeiten, um dies zu erreichen.) Die Konsolenausgabe ist ein einfacher Durchgang für das BDOS, aber etwas Komplexeres wie das Erstellen einer Datei auf einer Festplatte erfordert möglicherweise viele BIOS-Aufrufe zum Manipulieren der Medien. Da das BIOS eine standardmäßige, abstrakte Schnittstelle hat, weiß das BDOS immer, wie es das bekommt, was es will, und es ist ihm egal, wie das BIOS es tut.
Sie fragen sich wahrscheinlich, warum es nicht nur eine, sondern zwei Abstraktionen gibt (Programm-zu-BDOS und BDOS-zu-BIOS). Die Antwort ist, dass CP / M und sein BDOS in binärer Form für Computerhersteller bereitgestellt werden könnten. Sie würden ein benutzerdefiniertes BIOS mit Gerätetreibern für ihre Hardware schreiben, die beiden zusammenschrauben und als Betriebssystem für ihre Systeme ausliefern. Dies war eine große Sache, da das BDOS von einer Organisation gewartet wurde und daher für Benutzerprogramme immer eine bekannte Menge war, so dass es möglich war, dieselben Anwendungen auf einer (für die damalige Zeit) sehr großen Vielfalt von Hardware auszuführen. Aus diesem Grund gibt es Betriebssysteme und wir schreiben nicht nur Programme, die die Hardware direkt verändern .
Alles, was ich hier beschrieben habe, gilt auch für moderne Betriebssysteme. Unix abstrahiert zum Beispiel alles als Dateien. Es gibt Programme den gleichen Satz von Systemaufrufen ( open()
, write()
, close()
, etc.) zu kommunizieren , ob es sich um ein Plattenlaufwerk oder serielle Schnittstelle ist. Die Menge der Entscheidungen und Abstraktionen ist viel komplexer, aber es läuft letztendlich darauf hinaus, herauszufinden, welcher Gerätetreibercode auf der untersten Ebene ausgeführt werden muss, damit der Vorgang ausgeführt werden kann.