Wie genau spricht ein Programm mit einem Gerätetreiber?

12

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?

Jason
quelle
1
Ein bisschen von beiden, und es variiert von Betriebssystem und Gerätetyp.
Whatsisname

Antworten:

12

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 2und 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 5vom 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 CRegister mit der Funktionsnummer ( 2fü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.

Blrfl
quelle
Ich habe mir den CP / M-Code vorher noch nicht wirklich angesehen (es ist etwas früher als ich ... Ich habe CP / M-Computer verwendet, aber nie Code für sie geschrieben), aber ich bin ziemlich überrascht über die Verwendung von call 5hier. Wäre nicht rst 8viel effektiver gewesen (es würde 3 Bytes Speicher an der Zieladresse opfern, aber jedes Mal 2 speichern, wenn es aufgerufen wird ...)?
Jules
@Jules: CP / M wurde für den 8080 entwickelt, der nur einen Unterbrechungsmodus hatte, in dem unterbrechende Geräte einen Einzelbyte-Befehl (normalerweise a 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 .
Blrfl
Ah. Das macht Sinn, ja. Meine 8-Bit-Entwicklungserfahrung beschränkt sich auf Computer, die nur eine einzige Interrupt-Quelle hatten, sodass ich mich nicht um solche Dinge kümmern musste ... :)
Jules,
Kurze Frage, inwiefern hängt dieser Prozess mehr mit dem Windows-Betriebssystem und dem Windows-Kernel zusammen? Oder sollte ich dafür eine neue Frage stellen?
Jason
@Jason: Wikipedia hat eine Seite, die die Architektur beschreibt und die Antwort liefert. Alles, was Microsoft seit 1993 produziert, verwendet diese Architektur. Es ist fast dasselbe, nur mit mehr Schichten im Kuchen.
Blrfl
0

Es gibt verschiedene Möglichkeiten:

  • Für häufig verwendete Geräte enthält das Betriebssystem häufig eine API, die Treiber implementieren und die die Standardbibliothek Ihrer Sprache anpasst. Typische Beispiele: Dateisysteme, Drucker, Netzwerk, MIDI-Instrumente.
  • Für exotischere Geräte muss der Gerätehersteller Treiber bereitstellen, und manchmal enthalten diese auch Sprachbindungen für gängige Sprachen. Zumindest wird es C-Bindungen geben, und so ziemlich alle Sprachen haben eine Möglichkeit, C-Bibliotheken aufzurufen.
  • Etwas dazwischen können einfache Geräte nur eine Universalverbindung wie eine serielle Schnittstelle verwenden, und der Hersteller veröffentlicht nur das Protokoll, das Sie dann über den generischen Treiber für die serielle Schnittstelle verwenden können.
Michael Borgwardt
quelle