Ich bin verwirrt darüber, wie genau wir als Programmierer mit Geräten auf dem Computer kommunizieren. Jetzt spreche ich nicht die großen Ideen. Ich weiß, dass es Gerätetreiber gibt, die auf der Hardware installiert sind, sodass verschiedene Programme diese Funktionen verwenden können.
Aber wer spricht eigentlich genau mit den Fahrern? Schreibt der Programmierer die Anwendung, die für den Aufruf einer Funktion im Treiber verantwortlich ist? Oder ruft der Programmierer eine Funktion über das Betriebssystem auf, die dann den Aufruf an den Treiber bearbeitet?
Antworten:
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:
(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 kennen5
. 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 dasC
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 aufgerufen
CONOUT
, 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.quelle
call 5
hier. Wäre nichtrst 8
viel effektiver gewesen (es würde 3 Bytes Speicher an der Zieladresse opfern, aber jedes Mal 2 speichern, wenn es aufgerufen wird ...)?RST
) auf den Datenbus setzten . Ich kann es nicht mit Sicherheit sagen, aber es könnte sein, dass es nicht genügend Steckplätze gab, um die Anforderungen aller Geräte zu erfüllen. Dazu kam DDT (mit dessen Hilfe Haltepunkte erstellt wurden) und die Verwendung von einem zur Eingabe des BDOS .Es gibt verschiedene Möglichkeiten:
quelle