Betriebssystemtreiber vs. BIOS-Treiber

662
Gilles

Ich habe einige grundlegende Betriebssystemklassen, Videoserien usw. durchlaufen und habe diese Frage zu den Betriebssystemtreibern vs. BIOS-Treibern. Wie kennt ein Basis-Betriebssystem die Speicheradresse der einzelnen Hardwarekomponenten? Wie funktioniert ein Betriebssystem auf einem beliebigen Computer "out of the box"? Gibt es ein Standardspeicherlayout, das jeder kennt? Oder würde das Betriebssystem sein IVT so umleiten, dass es auf BIOS-Gerätetreiber verweist? Bitte weisen Sie mich auf etwas Lesestoff für dieses Thema.

2

3 Antworten auf die Frage

2
user996142

Wie kennt ein Basis-Betriebssystem die Speicheradresse der einzelnen Hardwarekomponenten? Wie funktioniert ein Betriebssystem auf einem beliebigen Computer "out of the box"?

Die CPU weiß nur die erste Adresse, die ausgeführt werden soll. BIOS / Firmware sollte auf diese Adresse "antworten", damit die CPU bootstrap.

Und für Speicher und E / A (ich hoffe, Sie wissen, dass es in x86 zwei Speicherplätze gibt: Arbeitsspeicher und E / A, oder?), Gab es viele Standards.

Erste PC-Ära

Im Speicher befand sich ein halboffizieller Bereich namens BIOS DATA AREA. Es gab einige Informationen über die Anzahl der COM- und LPT-Ports, Diskettenlaufwerk-Controller, deren Basis-E / A-Adressen usw. Das Betriebssystem verwendete auch BIOS-Aufrufe ( dokumentierte Interrupts), um auf Hardware zuzugreifen. Motherboard - Anbieter fest einprogrammiert, die auf BIOS - Adressen. Einige Geräte hatten offiziell dokumentierte E / A-Adressen.

Erweiterungskarten wie ISA verfügten über keine Tools, die außer BIOS-Erweiterungskarten erkannt werden sollten: Das System-BIOS untersuchte den Speicher nach speziellen Mustern, um das BIOS der Erweiterungskarte zu finden und auszuführen. Das Karten-BIOS installiert sich möglicherweise selbst als Interrupt-Verctor, um die BIOS-Funktionen zu "spiegeln", um das Starten des Netzwerks usw. zu ermöglichen.

In vielen Fällen lag es in der Verantwortung des Benutzers, die Karte mit Jumpern zu konfigurieren und Informationen für die Software bereitzustellen (z. B. die BLASTERenv-Variable für Soundblaster-Parameter usw.).

PnP-Ära

PnP ist ein Paket von Spezifikationen zur Hardwareerkennung. Es gab ISA PNP, COM PORT PNP, LPT PNP usw. In den Spezifikationen wird beschrieben, mit welcher Software geprüft werden soll, welches Gerät angeschlossen ist und wie das Gerät verhalten soll. Einige Busse wie PCI verfügen über eine integrierte PNP-Funktion. Die Software kann alle PCI-Karten auflisten und sie nach den benötigten Ressourcen, dem Hersteller und der Klasse (Treiber suchen) usw. fragen und sie dann zusammenfassen. Aufzählung ist auch für USB möglich.

"Software" kann in diesem Fall ein PNPBIOS- oder PNP-fähiges Betriebssystem sein. Daher verwendete das BIOS diese Spezifikationen, um das Startgerät und die PCI-Host-Bridge ("Stamm" des PCI-Busses) zu finden, und diese Informationen in speziellen Tabellen im Speicher (gemäß PNPBIOS-Spezifikation) abgelegt und vom Betriebssystem gelesen und anhand der PCI- und USB-Funktionen aufgelistet Geräte aktivieren (PCI- und USB-Protokolle sind dokumentiert).

ACPI-Ära

ACPI-Tabellen werden vom Hersteller des Motherboards gefüllt und in Firmware gespeichert (moderne Firmware ist kein " BIOS ", kann es aber emulieren).

Eine spezielle Tabelle mit der Bezeichnung DSDT beschreibt jedes Systemgerät, einschließlich spezieller Laptoptasten, Laptopakkus, Lüfter, PCI-Express-Root-Komplex usw.

Geräte werden in der Sprache AML beschrieben und das Betriebssystem sollte über einen Interpreter verfügen. DSDT beschreibt möglicherweise Arbeitsspeicher, E / A und "Methoden" (auch in AML geschrieben), um beispielsweise "Helligkeit ändern" auszuführen.

ACPI ist eine riesige Spezifikation. Das Betriebssystem verwendet DSDT zum Füllen seines internen "Gerätebaums". Sobald es Zugriff auf "PCI-Express-Root-Komplex" oder "Root-USB" erhalten hat, verwendet es die PCI-Express- und USB-Protokolle, um weitere Aufzählungen und Konfigurationen vorzunehmen: Die Karte meldet möglicherweise Speicherunterstützung Bereich A und B, und OS konfiguriert es für die Verwendung von "B".

0
Richard Chambers

Die meisten Betriebssysteme bestehen aus verschiedenen Komponenten wie Speichermanager, Eingabe-Ausgabe, Dateisystem-Manager usw. Vor Jahren mit monolithischen Betriebssystemen wurde alles zusammengebaut. Die meisten modernen Betriebssysteme verfügen über eine Möglichkeit, die verschiedenen Komponenten dynamisch ein- und auszublenden. Einige Betriebssysteme, Mikrokerne, verfügen lediglich über eine grundlegende Verwaltungsfunktionalität für das Betriebssystem, wobei die meisten zusätzlichen Komponenten, z. B. das Dateisystem, Teile hinzugefügt werden.

Moderne Betriebssysteme sind auch in einer Reihe von Schichten aufgebaut, die dem OSI-Modell für Netzwerkstacks ähneln (siehe https://en.wikipedia.org/wiki/OSI_model ), um eine möglichst große Unabhängigkeit von der tatsächlichen Hardware zu gewährleisten, auf der sie sich befinden Laufen wie möglich.

Das Betriebssystem ist also im Grunde eine abstrakte Maschine, in die konkrete, hardwarespezifische Module eingesteckt sind. Es gibt Schnittstellenspezifikationen, die eher eine abstrakte Maschinenbeschreibung sind, die die Steuerung und die Daten und die Dienste beschreiben, die die hardwarespezifischen Module für das Betriebssystem bereitstellen.

Ein Installer für einen bestimmten Gerätetreiberstapel kennt also seine spezifischen, konkreten Hardwareanforderungen und Schnittstellen zu einem Gerät, das Betriebssystem kennt jedoch diese spezifischen Hardwareanforderungen nicht. Das Betriebssystem delegiert alle gnarly gerätespezifischen Elemente an den Gerätetreiberstapel.

Ich verwende das Wort "Stack", da die Funktionalität, die die eigentliche Gerätekommunikation durchführt, normalerweise aus einer Reihe von Schichten besteht. Bei den meisten Geräten, die eine Reihe von Treiberdateien anzeigen, die für ein bestimmtes Gerät verwendet werden, sehen Sie dies mit dem Windows-Geräte-Manager. enter image description here

Es gibt also verschiedene Softwarekomponenten, die tatsächlich von verschiedenen Herstellern stammen können.

Wenn das Betriebssystem Details zur Hardware erfahren möchte, fragt es den Gerätetreiber nach diesen Details.

Ein Betriebssystem funktioniert standardmäßig auf einer Vielzahl von Hardwareplattformen, da die Anbieter der spezifischen Hardware, aus der die Plattform besteht, den Treiberstack bereitstellen, den das Betriebssystem auf der konkreten und spezifischen Hardware benötigt.

Unterschiedliche Betriebssysteme weisen unterschiedliche Schnittstellenspezifikationen für die Gerätetreiber auf, die das Betriebssystem verwenden soll. Für Linux müssen Sie daher mit einem Linux-Betriebssystem kompatible Treiber haben, die die Linux-Treiberschnittstelle bereitstellen. Für Windows müssen Sie Windows-Schnittstellentreiber haben.

Da es einen Treiberstack gibt, kann es sein, dass einige der Softwarekomponenten im Stapel unter verschiedenen Betriebssystemen gleich sind, solange die gleiche Hardware verwendet wird. Die Teile der Schicht, die direkt mit dem Hardwaregerät kommunizieren, können identisch sein, aber die oberen Ebenen des Stacks, die sich in das tatsächliche Betriebssystem einbinden müssen, sind unterschiedlich, da unterschiedliche Betriebssysteme unterschiedliche Gerätetreiber-Schnittstellen haben.

Es gibt Tonnen von Büchern über Betriebssysteme und es gibt Tonnen von Open-Source-Projekten für verschiedene Betriebssysteme.

Werfen Sie einen Blick auf diese Diskussion https://www.quora.com/What-isthe-best-book-on-operating-systems

Es gibt eine Reihe kostenloser Online-Bücher wie http://pages.cs.wisc.edu/~remzi/OSTEP/

Und werfen Sie einen Blick auf diese github-Seite über Open Source-Betriebssysteme https://github.com/showcases/open-source-operating-systems

Dies beantwortet die Frage nicht wirklich. Sie erläutern, wie ein Betriebssystem entworfen werden kann, aber nicht, wie Informationen über die Hardware abgerufen werden. Dies ist der Punkt der Frage. Gilles vor 6 Jahren 0
@Gilles "Wenn das Betriebssystem Details über die Hardware erfahren möchte, fragt es den Gerätetreiber nach diesen Details." Richard Chambers vor 6 Jahren 0
Dieser Satz macht nicht viel Sinn, da der Treiber Teil des Betriebssystems ist. Gilles vor 6 Jahren 0
@Gilles-Treiber ist eine Komponente, die vom Betriebssystem verwendet wird. Es ist zwar Teil des Betriebssystems, aber kein größeres Betriebssystem macht es auf diese Weise mehr, weshalb Dinge wie Windows Plug & Play funktionieren. Richard Chambers vor 6 Jahren 0
Treiber * sind * Bestandteil von Betriebssystemen wie Windows. Möglicherweise verwechseln Sie "Betriebssystem" mit "Kernel". Trotzdem enthalten viele große Betriebssysteme Treiber im Kernel, beispielsweise Linux und * BSD. Gilles vor 6 Jahren 0
@Gilles nein, ich verwechsle den Kernel nicht mit dem Betriebssystem. Treiber sind Softwarekomponenten. Sie können vom Betriebssystem nach Bedarf dynamisch geladen werden, oder sie können für spezielle Zwecke oder bestimmte Ziele in das Betriebssystem eingebaut werden. In den meisten Fällen wird die Flexibilität des dynamischen Ladens so gewählt, dass Treiber einfach ausgetauscht oder aufgerüstet werden können. Es ist viel einfacher, einen Gerätetreiber dynamisch zu entladen und neu zu laden, als einen Betriebssystemaufbau mit einem neuen Treiber durchzuführen. Richard Chambers vor 6 Jahren 0
0
Gilles

Auf einem modernen PC meldet jede Hardware auf Anfrage einige grundlegende Informationen über sich. Beispielsweise sind viele Peripheriegeräte an den PCI-Bus angeschlossen . Wenn das Betriebssystem wissen möchte, welche Peripheriegeräte an den PCI-Bus angeschlossen sind, sendet es eine Anweisung an den Bus und fordert jedes Peripheriegerät auf, eine Beschreibung zu senden. Dies wird als Aufzählen (die angeschlossenen Geräte) des Busses bezeichnet. In dieser Beschreibung wird ein numerischer Code verwendet, um jedes als PCI-ID bezeichnete Gerätemodell zu identifizieren . Wenn das Betriebssystem feststellt, dass ein Gerät mit einer bestimmten PCI-ID vorhanden ist, versucht es, einen Treiber für diese PCI-ID zu laden. Wenn das Betriebssystem keinen Treiber hat, kann es versuchen, einen Treiber herunterzuladen oder dem Benutzer mitzuteilen, dass ein unbekanntes Gerät vorhanden ist.

Unter Linux können Sie beispielsweise den Befehl ausführen, lspcium PCI-Geräte aufzulisten. Es hat verschiedene Optionen, um verschiedene Arten von Informationen anzuzeigen, wenn Sie neugierig sind. In dieser Antwort beschreibe ich den Mechanismus, den Linux zum Laden eines Treibers für ein PCI-Gerät verwendet . Das ist nur ein Beispiel. Andere PC-Betriebssysteme verfügen über einen Mechanismus, der dasselbe tut, dieser Mechanismus kann jedoch völlig anders sein.

Woher weiß das Betriebssystem, dass es überhaupt einen PCI-Bus gibt und wie auf den Bus zugegriffen wird? Ich denke, das ist hart codiert, wenn Sie es für eine PC-Architektur erstellen. Beachten Sie, dass die „PC-Architektur“ spezifischer ist als die „x86-CPU“ - Sie könnten einen anderen Satz von Bussen um eine x86-CPU setzen, aber dann würde ich nicht von einem (modernen) PC sprechen.

Unterschiedliche Rechnerarchitekturen verfügen möglicherweise über keine Möglichkeiten, vorhandene Treiber aufzulisten. Beispielsweise verfügte PC bis Mitte der 1990er Jahre nicht über solche Methoden. Vor dem PCI-Bus gab es den ISA-Bus. Wenn Sie auf einem ISA-Bus wissen möchten, ob ein Gerät an einer bestimmten Adresse vorhanden ist, senden Sie einen Befehl an ihn. Wenn Sie eine Antwort bekommen, die Sie verstehen, gut. Wenn der Befehl den Computer blockiert oder einen unbeabsichtigten Effekt verursacht, weil es ein völlig anderes Peripheriegerät gibt, zäh. Auf einem 1908s-PC hat das Betriebssystem das BIOS nach den konfigurierten Geräten gefragt (das BIOS listete jedoch nicht alle Geräte auf, nur die Gerätetypen, von denen das BIOS wusste) und den Benutzer, der eine Erweiterungskarte installiert hat, um sie bereitzustellen Konfigurationsdetails entweder im BIOS oder in der Betriebssystemkonfiguration. Das BIOS enthielt einige grundlegende Treiber für die Tastatur und den Bildschirm, und Betriebssysteme wie DOS bezeichneten diese Treiber. andere Betriebssysteme (oder Anwendungen) können direkt auf die Hardware zugreifen (insbesondere für die Anzeige, da die BIOS-Treiber langsam und begrenzt waren).

Bis heute haben die meisten eingebetteten Systeme keine Möglichkeit, integrierte Peripheriegeräte aufzuführen. Viele Geräte (insbesondere ARM-basierte Geräte, aber nicht nur diese) beschreiben ihre Peripheriegeräte in einer Datenstruktur, die als Gerätebaum bezeichnet wird . Diese Datenstruktur wird in einem ROM- oder Flash-Speicher gespeichert und der Bootloader (das Äquivalent des BIOS) übermittelt die Daten an das Betriebssystem. Auf diese Weise muss das Betriebssystem nicht für eine bestimmte Gruppe von Geräten erstellt werden. Es liest diese Informationen beim Start.