Betriebssystemtreiber vs. BIOS-Treiber

Betriebssystemtreiber vs. BIOS-Treiber

Ich habe einige Kurse, Videoserien usw. zu den Grundlagen von Betriebssystemen besucht und habe folgende Frage zu Betriebssystemtreibern im Vergleich zu BIOS-Treibern. Woher kennt ein einfaches Betriebssystem die Speicheradresse jedes Hardwareteils? Wie funktioniert ein Betriebssystem auf jedem Computer sofort nach der Installation? Gibt es ein standardmäßiges Gerätespeicherlayout, das jeder kennt? Oder würde das Betriebssystem seine IVT umleiten, um auf BIOS-Gerätetreiber zu verweisen? Bitte nennen Sie mir Lesematerial zu diesem Thema.

Antwort1

Woher kennt ein einfaches Betriebssystem die Speicheradresse jedes Hardwareteils? Wie funktioniert ein Betriebssystem sofort auf jedem Computer?

Die CPU kennt nur die erste auszuführende Adresse. BIOS/Firmware müssen auf diese Adresse „antworten“, damit die CPU booten kann.

Und für Speicher und E/A (ich hoffe, Sie wissen, dass es in x86 zwei Bereiche gibt: Speicher und E/A, richtig?) gab es viele Standards.

Erste PC-Ära

Es gab einen halboffiziellen Bereich im Speicher namens BIOS DATA AREA. Er enthielt einige Informationen über die Anzahl der COM- und LPT-Ports, Diskettenlaufwerk-Controller, ihre Basis-E/A-Adressen und so weiter. Das Betriebssystem verwendete auch BIOS-Aufrufe (dokumentiertInterrupts) um auf die Hardware zuzugreifen. Motherboard-Herstellerfest codiertdas adressiert das BIOS. Einige Geräte hatten offiziell dokumentierte E/A-Adressen.

Erweiterungskarten wie ISA verfügten außer dem Erweiterungskarten-BIOS über keine Tools zur Erkennung: Das System-BIOS durchsuchte den Speicher nach speziellen Mustern, um das Erweiterungskarten-BIOS zu finden und auszuführen. Das Karten-BIOS installiert sich möglicherweise selbst als Interrupt-Verctor, um BIOS-Funktionen zu „beschatten“, um Netzwerkstarts usw. zu ermöglichen.

In vielen Fällen lag es in der Verantwortung des Benutzers, die Karte mit Jumpern zu konfigurieren und der Software Informationen bereitzustellen (wie etwa BLASTERUmgebungsvariablen für Sound Blaster-Parameter usw.).

PnP-Ära

PnP ist ein Paket von Spezifikationen zur Hardwareerkennung. Es gab ISA PNP, COM PORT PNP, LPT PNP usw. Spezifikationen beschreiben, was Software tun soll, um zu prüfen, welches Gerät angeschlossen ist und wie das Gerät reagieren soll. Einige Busse wie PCI haben integrierte PNP-Fähigkeit. Software kann alle Karten auf PCI auflisten und sie nach den benötigten Ressourcen, ihrem Hersteller und ihrer Klasse (um den Treiber zu finden) usw. fragen und sie dann konfigurieren. Die Aufzählung ist auch für USB möglich.

„Software“ kann in diesem Fall PNPBIOS oder ein PNP-fähiges Betriebssystem sein. Das BIOS hat also diese Spezifikationen verwendet, um das Startgerät und die PCI-Hostbrücke („Root“ des PCI-Busses) zu finden und diese Informationen in speziellen Tabellen im Speicher zu speichern (gemäß PNPBIOS-Spezifikation) und das Betriebssystem hat sie gelesen und PCI- und USB-Funktionen verwendet, um Geräte aufzulisten und zu aktivieren (PCI- und USB-Protokolle sind dokumentiert).

ACPI-Ära

ACPI-Tabellen werden vom Motherboard-Hersteller ausgefüllt und in der Firmware gespeichert (moderne Firmware istnicht"BIOS, kann es aber emulieren).

Eine spezielle Tabelle namens DSDT beschreibt alle Systemgeräte, einschließlich spezieller Laptop-Tasten, Laptop-Akkus, Lüfter, PCI-Express-Root-Komplex und so weiter.

Geräte werden in einer Sprache namens AML beschrieben und das Betriebssystem sollte über einen eigenen Interpreter verfügen. DSDT kann Speicher, IO und „Methoden“ (ebenfalls in AML geschrieben) beschreiben, um Dinge wie „Helligkeit ändern“ zu tun.

ACPI ist eine riesige Spezifikation. Das Betriebssystem verwendet DSDT, um seinen internen „Gerätebaum“ zu füllen, und sobald es Zugriff auf den „PCI-Express-Root-Komplex“ oder Root-USB erhält, verwendet es PCI-Express- und USB-Protokolle für weitere Aufzählungen und Konfigurationen: Die Karte meldet möglicherweise, dass sie die Speicherbereiche A und B unterstützt, und das Betriebssystem konfiguriert sie für die Verwendung von „B“.

Antwort2

Die meisten Betriebssysteme bestehen aus verschiedenen Komponenten wie Speichermanager, Eingabe-/Ausgabe, Dateisystemmanager usw. Vor Jahren wurde bei monolithischen Betriebssystemen alles zusammengebaut. Die meisten modernen Betriebssysteme verfügen über eine Möglichkeit, die verschiedenen Komponenten dynamisch ein- und auszuwechseln. Einige Betriebssysteme, Mikrokernel, verfügen nur über eine grundlegende Verwaltungsfunktion für das Betriebssystem, wobei die meisten zusätzlichen Komponenten wie das Dateisystem Zusatzteile sind.

Moderne Betriebssysteme sind ebenfalls in einer Reihe von Schichten aufgebaut, ähnlich dem OSI-Modell für Netzwerkstapel (siehehttps://en.wikipedia.org/wiki/OSI-Modell), um eine möglichst große Unabhängigkeit von der eigentlichen Hardware zu gewährleisten, auf der sie ausgeführt werden.

Das Betriebssystem ist also im Grunde eine abstrakte Maschine, in die konkrete, hardwarespezifische Module eingesteckt werden. Es gibt Schnittstellenspezifikationen, die eher einer abstrakten Maschinenbeschreibung entsprechen und die Steuerung und die Daten sowie die Dienste beschreiben, die die hardwarespezifischen Module dem Betriebssystem bereitstellen sollen.

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

Ich verwende das Wort „Stapel“, weil die Funktionalität, die die eigentliche Gerätekommunikation durchführt, normalerweise aus einer Reihe von Schichten besteht. Sie können dies im Windows-Geräte-Manager bei den meisten Geräten sehen, der eine Reihe von Treiberdateien anzeigt, die für ein bestimmtes Gerät verwendet werden. Bildbeschreibung hier eingeben

Es handelt sich also um unterschiedliche Softwarekomponenten, die teilweise von unterschiedlichen Herstellern stammen.

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

Ein Betriebssystem funktioniert sofort auf einer Vielzahl von Hardwareplattformen, da die Anbieter der jeweiligen Hardware, aus der die Plattform besteht, den Treiberstapel bereitstellen, den das Betriebssystem zum Funktionieren auf der konkreten und spezifischen Hardware benötigt.

Verschiedene Betriebssysteme haben unterschiedliche Schnittstellenspezifikationen für die Gerätetreiber, die das Betriebssystem verwenden soll. Für Linux benötigen Sie also Linux-kompatible Treiber, die die Linux-Treiberschnittstelle bereitstellen. Für Windows benötigen Sie Windows-Schnittstellentreiber.

Da es einen Treiberstapel gibt, kann es sein, dass einige der Softwarekomponenten im Stapel bei verschiedenen Betriebssystemen gleich sind, solange dieselbe Hardware verwendet wird. Die Teile der Schicht, die direkt mit dem Hardwaregerät kommunizieren, können gleich sein, aber die oberen Ebenen des Stapels, die mit dem eigentlichen Betriebssystem kommunizieren müssen, sind unterschiedlich, da verschiedene Betriebssysteme unterschiedliche Gerätetreiberschnittstellen haben.

Es gibt unzählige Bücher über Betriebssysteme und unzählige Open-Source-Projekte für verschiedene Betriebssysteme.

Schauen Sie sich diese Diskussion anhttps://www.quora.com/Was-ist-das-beste-buch-über-betriebssysteme

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

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

Antwort3

Auf einem modernen PC meldet jedes Stück Hardware auf Anfrage einige grundlegende Informationen über sich selbst. Beispielsweise sind viele Peripheriegeräte an denPCI-BusWenn das Betriebssystem wissen möchte, welche Peripheriegeräte an den PCI-Bus angeschlossen sind, sendet es eine Anweisung über den Bus und fordert jedes Peripheriegerät auf, eine Beschreibung zu senden. Dies nennt manAufzählung(die Geräte auf) dem Bus. Diese Beschreibung verwendet einen numerischen Code zur Identifizierung jedes Gerätemodells, genanntPCI-ID. Wenn das Betriebssystem erkennt, 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 herunterzuladen oder dem Benutzer melden, dass ein unbekanntes Gerät vorhanden ist.

Unter Linux können Sie beispielsweise den Befehl ausführen, lspcium PCI-Geräte aufzulisten. Es gibt verschiedene Optionen zum Anzeigen unterschiedlicher Informationen. Probieren Sie ein bisschen herum, wenn Sie neugierig sind. Ich beschreibe den Mechanismus, den Linux zum Laden eines Treibers für ein PCI-Gerät verwendet, indiese Antwort. Das ist nur ein Beispiel; andere PC-Betriebssysteme verfügen über einen Mechanismus, um dasselbe zu tun, aber dieser Mechanismus kann völlig anders sein.

Woher weiß das Betriebssystem, dass es überhaupt einen PCI-Bus gibt, und wie greift es auf den Bus zu? Ich denke, das ist fest codiert, wenn Sie es für eine PC-Architektur bauen. Beachten Sie, dass „PC-Architektur“ spezifischer ist als „x86-CPU“ – Sie könnten einen anderen Satz Busse um eine x86-CPU herum anordnen, aber dann würde man es nicht als (modernen) PC bezeichnen.

Verschiedene Maschinenarchitekturen verfügen möglicherweise über Möglichkeiten, vorhandene Treiber aufzulisten, aber nicht unbedingt. Beispielsweise verfügten PCs bis Mitte der 1990er Jahre nicht über solche Methoden. Vor dem PCI-Bus gab es denISA-Bus. Wenn Sie auf einem ISA-Bus wissen möchten, ob ein Gerät an einer bestimmten Adresse vorhanden ist, senden Sie einen Befehl dorthin. Wenn Sie eine Antwort erhalten, die Sie verstehen, ist das gut. Wenn der Befehl den Computer blockiert oder einen unbeabsichtigten Effekt verursacht, weil ein völlig anderes Peripheriegerät vorhanden ist, ist das Pech. Auf einem PC aus dem Jahr 1908 fragte das Betriebssystem das BIOS nach den konfigurierten Geräten (das BIOS listete jedoch nicht alle Geräte auf, sondern nur Gerätetypen, die dem BIOS bekannt waren), und der Benutzer, der eine Erweiterungskarte installierte, musste deren Konfigurationsdetails entweder im BIOS oder in der Betriebssystemkonfiguration angeben. Das BIOS enthielt einige grundlegende Treiber für Tastatur und Bildschirm, und Betriebssysteme wie DOS riefen diese Treiber auf; andere Betriebssysteme (oder Anwendungen) konnten direkt auf die Hardware zugreifen (insbesondere für die Anzeige, da die BIOS-Treiber langsam und begrenzt waren).

Auch heute noch haben die meisten eingebetteten Systeme keine Möglichkeit, eingebaute Peripheriegeräte aufzuzählen. Viele Geräte (insbesondere ARM-basierte, aber nicht nur diese) beschreiben ihre Peripheriegeräte in einer Datenstruktur namensGerätebaumDiese Datenstruktur wird im ROM oder Flash-Speicher gespeichert und dieBootloader(das Äquivalent des BIOS) übermittelt die Daten an das Betriebssystem. Auf diese Weise muss das Betriebssystem nicht für eine bestimmte Anzahl von Geräten erstellt werden, sondern liest diese Informationen beim Start.

verwandte Informationen