Warum benötigen eingebettete Systeme einen Gerätebaum, PCs nicht?

10

Wenn Sie einen Kernel in einem eingebetteten Gerät booten, müssen Sie dem Linux-Kernel einen Gerätebaum bereitstellen, während für das Booten eines Kernels auf einem normalen x86-PC kein Gerätebaum erforderlich ist - warum?

Wie ich verstehe, "prüft" der Kernel auf einem x86-PC nach Hardware (korrigieren Sie mich, wenn ich falsch liege). Warum kann der Kernel also nicht nach Hardware in einem eingebetteten System suchen?

MOHAMMAD RASIM
quelle

Antworten:

16

Peripheriegeräte sind über einen Bus mit dem Hauptprozessor verbunden . Einige Busprotokolle unterstützen die Aufzählung (auch als Erkennung bezeichnet), dh der Hauptprozessor kann fragen, welche Geräte an diesen Bus angeschlossen sind. und die Geräte antworten mit einigen Informationen über Typ, Hersteller, Modell und Konfiguration in einem standardisierten Format. Mit diesen Informationen kann das Betriebssystem die Liste der verfügbaren Geräte melden und entscheiden, welcher Gerätetreiber für jedes dieser Geräte verwendet werden soll. Einige Busprotokolle unterstützen keine Aufzählung, und der Hauptprozessor kann nur herausfinden, welche Geräte angeschlossen sind, außer zu raten.

Alle modernen PC-Busse unterstützen die Aufzählung, insbesondere PCI (das Original sowie seine Erweiterungen und Nachfolger wie AGP und PCIe), über die die meisten internen Peripheriegeräte angeschlossen sind, USB (alle Versionen), über die die meisten externen Peripheriegeräte angeschlossen sind sowie Firewire , SCSI , alle modernen Versionen von ATA / SATA usw. Moderne Monitorverbindungen unterstützen auch die Erkennung des angeschlossenen Monitors ( HDMI , DisplayPort , DVI , VGA mit EDID)). Auf einem PC kann das Betriebssystem die angeschlossenen Peripheriegeräte erkennen, indem es den PCI-Bus auflistet und den USB-Bus auflistet, wenn es einen USB-Controller auf dem PCI-Bus usw. findet. Beachten Sie, dass das Betriebssystem die Existenz des PCI-Busses annehmen muss und der Weg, es zu untersuchen; Dies ist in der PC-Architektur standardisiert („PC-Architektur“ bedeutet nicht nur einen x86-Prozessor: Um ein (moderner) PC zu sein, muss ein Computer auch einen PCI-Bus haben und auf eine bestimmte Weise booten).

Viele eingebettete Systeme verwenden weniger ausgefallene Busse, die keine Aufzählung unterstützen. Dies galt bis Mitte der neunziger Jahre für PCs, bevor PCI ISA überholte . Insbesondere die meisten ARM-Systeme verfügen über Busse, die keine Aufzählung unterstützen. Dies ist auch bei einigen eingebetteten x86-Systemen der Fall, die nicht der PC-Architektur folgen. Ohne Aufzählung muss dem Betriebssystem mitgeteilt werden, welche Geräte vorhanden sind und wie auf sie zugegriffen werden kann. Der Gerätebaum ist ein Standardformat zur Darstellung dieser Informationen.

Der Hauptgrund, warum PC-Busse die Erkennung unterstützen, besteht darin, dass sie eine modulare Architektur ermöglichen, in der Geräte hinzugefügt und entfernt werden können, z. B. das Hinzufügen einer Erweiterungskarte zu einem PC oder das Anschließen eines Kabels an einen externen Port. Eingebettete Systeme haben normalerweise einen festen Satz von Geräten¹ und ein Betriebssystem, das vom Hersteller vorinstalliert ist und nicht ersetzt wird, sodass keine Aufzählung erforderlich ist.

¹ Wenn ein externer Bus wie USB vorhanden ist und USB-Peripheriegeräte automatisch erkannt werden, werden sie im Gerätebaum nicht erwähnt.

Gilles 'SO - hör auf böse zu sein'
quelle
11

PCs benötigen tatsächlich einen Gerätebaum.

Sie nennen es einfach etwas anderes.

Es ist nicht richtig zu sagen, dass Betriebssysteme für die Nachkommen von PC / AT-kompatiblen Geräten die Existenz von Dingen wie einem PCI-Bus voraussetzen. Sie nicht.

Sie untersuchen auch nicht. Seit Mitte der neunziger Jahre war es nicht mehr erforderlich, nach Hardware zu suchen, nur einige E / A- oder Speicheradressen zu durchsuchen, um festzustellen, ob sie funktionieren.

Sie zählen vielmehr einen Root-Bus auf .

Dies ist ein Bus, der nicht wie bei anderen aufzählbaren Bussen durch Kommunikation mit der Hardware des Buscontrollergeräts aufgezählt werden kann. Dies ist ein Bus, der nur als Konstrukt der Systemfirmware und des Betriebssystems existiert. Es wird durch Abfragen der System-Firmware aufgelistet, und was darauf vorhanden ist, wird vom Mainboard-Hersteller in die System-Firmware eingebrannt, um mit dem übereinzustimmen, was sich auf dem Mainboard befindet.

Das Konzept unterscheidet sich kaum von diesem und einem Gerätebaum. Genau wie ein Gerätebaum muss er so erstellt werden, dass er mit der tatsächlichen Karte übereinstimmt. Genau wie bei einem Gerätebaum handelt es sich um eine Liste von Geräteknoten, an die (unter anderem) Ressourceninformationen angehängt sind. Genau wie ein Gerätebaum befindet er sich außerhalb des Betriebssystems und ist keine Liste von Dingen, nach denen gesucht werden muss, um fest in den Code des Betriebssystems eingebunden zu sein.

Die Plug-and-Play-BIOS-Spezifikation sieht vor, dass die Firmware einem Betriebssystem einen einfachen Gerätebaum im Speicher bereitstellt, von dem einer (z. B.) ein PNP0A03Knoten ist, der einen PCI-Bus bezeichnet und die E / A- und Speicherressourcen angibt, die er enthält zugewiesen ist und somit dort, wo es zu finden ist.

ACPI ersetzt dies, aber die Idee bleibt dieselbe. In ACPI gibt es eine Tabelle namens Differentiated System Description Table , ergänzt durch eine Secondary System Descriptor Table , die (mit Informationen aus einigen anderen ACPI-Tabellen) fast dasselbe bietet.

(Wenn Sie dies von Seiten der Firmware-Entwickler sehen möchten, sehen Sie sich Coreboot als Beispiel an. Es enthält eine große Anzahl von ACPI-Quellensprachendateien, von denen eine Auswahl zu einem Bytecode-Binärbild kompiliert wird, das in die Firmware integriert ist. Die Auswahl wird von einem Konfigurationstool gesteuert, das Sie zur Eingabe des gewünschten Mainboards auffordert.)

Unter FreeBSD wurden beispielsweise die Plug-and-Play-BIOS-Spezifikationsinformationen von einem pnpbiosBustreiber im Kernel (der inzwischen entfernt wurde) aufgelistet, und (heutzutage) werden die ACPI-Informationen von einem Bustreiber aufgelistet acpi. Unter Linux gibt es (noch) einen drivers/pnp/pnpbiosBustreiber, der die Plug-and-Play-BIOS-Tabellen liest, und die ACPI-Tabellen werden durch Code gelesen, der über arch/arm64/kernel/und verteilt ist arch/x86/kernel/.

Der aufzählbare Root-Bus kann, kann sich aber im Allgemeinen nicht (bei einigen Eingriffen durch ACPI) mit den auf den Bussen aufzählbaren Dingen überschneiden, die Geräte auf dem Root-Bus sind. Während beispielsweise PNPxxxxIDs für ATA-Busse vorhanden sind, listet die Systemfirmware keine PCI-zu-ATA-Bridge-Geräte auf dem Root-Bus auf, die diese verwenden. Solche Geräte werden gefunden, indem der PCI-Bus beim Auflisten des Root-Busses und dann die PCI-zu-ATA-Brücke beim Aufzählen des PCI-Busses gefunden werden.

Die einfache Tatsache ist, dass auf stark divergierenden Plattformen mit unterschiedlichen Namen für die Konzepte dasselbe Grundprinzip in Kraft ist. Es gibt eine integrierte Liste von Geräten, die mit den ansonsten nicht aufzählbaren Geräten im System übereinstimmen, und die Firmware oder der verwendete Bootloader bietet dem Betriebssystem einen Mechanismus zum Lesen dieser Liste und zum Konfigurieren der darauf befindlichen Geräte das Betriebssystem, um diese Geräte dann abwechselnd aufzulisten.

Weiterführende Literatur

JdeBP
quelle