Nach meinem Verständnis stellt der Kernel die Verbindung zwischen Software und Hardware her, und daher muss der Kernel Systemaufrufe von Betriebssystemanwendungen leiten, richtig? Würden unterschiedliche E / A-Adresszuordnungen bedeuten, dass der Kernel anders programmiert werden muss? Lesen Sie weiter unten, da ich nicht glaube, dass ich diese Frage sehr genau formuliert habe.
Lassen Sie mich näher darauf eingehen, und korrigieren Sie mich bitte, wenn ich mich irre, da ich so verstanden habe, was in mehreren Artikeln angegeben wurde. Ich werde die x86-Familie als Basis für meine Beispiele verwenden. x86-Prozessoren verwenden den Befehl INT sowie einen Index namens Interrupt Vector Table, um eine INT-ID dem richtigen Speicherort der gewünschten Routine zuzuordnen (Routine und IVT im BIOS, richtig?). Die Routinen selbst sind so geschrieben, dass sie der für ein Computersystem spezifischen Hardware befehlen können, eine Aufgabe basierend auf dem Protokoll der verwendeten Hardware auszuführen. Auf diese Weise kann das Betriebssystem Systemaufrufe tätigen und mit der Hardware kommunizieren, ohne die systemspezifische Hardware oder E / A-Zuordnung zu kennen. Für die Kommunikation des Betriebssystems mit der Hardware ist lediglich die ID des gewünschten ISR erforderlich. Da der Kernel das Bindeglied zwischen Hardware und Software ist, müssen die Anwendungen, die vom Betriebssystem ausgeführt werden, nicht einmal die ISR-ID # kennen. Sie teilen dem Kernel einfach mit, dass sie beispielsweise Daten X auf die Festplatte schreiben möchten. Der Kernel leitet Daten X an den richtigen ISR weiter, der die Daten dann auf die Festplatte schreibt. Also würden zwei Systeme, die völlig identisch sind, außer dass sie unterschiedliche ISR-IDs für unterschiedliche Aufgaben verwenden, leicht unterschiedliche Kernel erfordern?
Und würde das auch bedeuten, dass der Bootsektor, der den Kernel lädt, auch von der Zuordnung der ISR-ID abhängt, da Systemaufrufe zum Lesen von der Festplatte erforderlich wären, um den Kernel zu laden?
Ich entschuldige mich, wenn dies am falschen Ort ist, aber ich habe gelesen, dass dies der richtige Ort für Hardware-bezogene Fragen ist. Vielen Dank!
quelle
Antworten:
Bezüglich der INTh-Befehle, auf die Sie verweisen (siehe: BIOS-Interrupt-Aufrufe ), Sie haben Recht, dass dies die Art und Weise war, wie ein Betriebssystem auf Low-Level-Hardware zugreift. In einer modernen Maschine landen diese Aufrufe (sofern sie ausgeführt werden) häufig im CSM (Compatibiliy Support Module, zumindest in der AMI-Sprache), das diese Anforderungen verarbeiten kann. In dem Fall eines Video-BIOS-Aufrufs, der den Code im Video-BIOS ausführen würde, falls vorhanden. Ich habe mit Intel IGPs als BIOS-Entwickler zusammengearbeitet, und als Teil des endgültigen Images hatten wir ein Tool von Intel, mit dem wir das Video-BIOS als Blob einbrennen.
Ebenso kann das BIOS "emulierte" Versionen von Aufrufen zum Lesen / Setzen der RTC implementieren. Ein modernes Betriebssystem wird einfach nicht alle dieser älteren Handler ausführen, da es nicht erforderlich ist, sich für diese Unterstützung auf das BIOS zu stützen. Beispielsweise gibt es möglicherweise einen Kerneltreiber, der weiß, wie man direkt mit Ihrem PCH kommuniziert, um sich mit dem zu messen RTC-Einstellungen.
Wie Sie sich vorstellen können, ist dies sehr, sehr langsam und wird von moderner Software nicht mehr verwendet. Stattdessen verfügt das Betriebssystem über die erforderliche Hardware, um eine Abstraktionsschicht bereitzustellen, die es grafischen Anwendungen ermöglicht, die GPU-Treiber zum Ausführen dieser Aufgaben zu verwenden. Dieses Gerät ist natürlich normalerweise PCIe von einem SW-POV und ist speicherabgebildet.
Wenn Sie sich den Linux-Speicherstapel unten ansehen, werden Sie feststellen, dass die zugrunde liegenden Kernel-Laufwerke sich darum kümmern, mit der Hardware zu kommunizieren, ohne das BIOS zu verwenden - der gesamte ausgeführte Code stammt aus Ihrem Kernel.
Denken Sie nun in Bezug auf verschiedene E / A-Adresszuordnungen und dergleichen daran, dass x86 sowohl einen E / A-Adressraum als auch einen Speicheradressraum hat. Wenn Sie sich an Plug-and-Play erinnern, durchläuft Ihr BIOS beim Hochfahren den PCI-Gerätebaum, der bei modernen Systemen im Grunde alle Ihre Peripheriegeräte umfasst, zumindest von einem SW-POV aus (dh der DRAM-Controller sitzt darauf) PCIe Bus 0, Ihre USB-Controller sind PCI-Geräte von einem SW-POV usw.). Unter Verwendung der BARs (Base Address Register) weiß das BIOS, wie viel Speicher und welchen Typ das Zielgerät haben möchte, und es wird sein Bestes tun, um die Anforderung zu erfüllen.
Die endgültige Zuordnung wird bei Übergabe an das Betriebssystem übergeben, und es kann sich dafür entscheiden, dies zu respektieren oder eine eigene Aufzählungsphase durchzuführen. Linux hat beispielsweise "Macken", die Sie vor dem Booten des Betriebssystems auf bestimmte PCI - Geräte - IDs anwenden können, und Sie können sich an Kernel - Bootparameter erinnern, die sich auf die Speicherzuweisung, die IRQs usw. auswirken können .
quelle