Was ich hier konkret wissen möchte, ist: Unabhängig von der zugrunde liegenden Hardware hängt es davon ab, wie der Linux-Kernel auf den unterschiedlichsten PCs funktioniert.
Oder allgemein, wie jeder Kernel (Microsoft NT-Kernel, Mac OS und Linux) auf jedem PC funktionieren kann, unabhängig von der Hardwarekonfiguration des PCs.
Um meine Zweifel zu erklären, hier ein Szenario: Im Vergleich zu PC-2 haben Bluetooth, Tastatur, WLAN usw. von PC-1 eine andere Konfiguration und wurden von einem anderen Hersteller entwickelt. Damit all diese Hardware funktioniert, sollte der Kernel vermutlich hardwarespezifischen Code haben, um diese Hardware zu aktivieren. Ich glaube, der Kernel hat eine Gerätetreiberschicht, in der er diese Hardware aktivieren sollte? Oder lädt er einfach gerätespezifische Firmware von woanders? Wo genau liegt hardwarespezifischer Code im Kernel? Beim Ausräumen meiner Zweifel bin ich auch auf HAL, BSP gestoßen. Was sind diese und wo liegen diese Schichten im Kernel?
Antwort1
Was ich hier speziell wissen möchte, ist, unabhängig von der zugrunde liegenden Hardware, wie der Linux-Kernel auf allen verschiedenen PCs funktioniert
Zunächst einmal kann der Kernel auf jedem PC ausgeführt werden, solange er für die jeweilige Architektur kompiliert wurde. Bei Ihren Allzweckcomputern ist die Architektur in der Regel dieselbe (x86_64/amd64), aber dies ändert sich, wenn Sie mit eingebetteten Geräten arbeiten.
Gerätebaum
Abgesehen von der Kompilierung ist der Kernel selbst hardwareunabhängig. Ich gebe Ihnen dieGerätebaum!
Der Linux-Kernel kümmert sich über den Gerätebaum um nicht erkennbare Hardware. Dieser gibt dem Kernel Informationen über CPU, Speicher, Busse, über I2C, SPI usw. angeschlossene Geräte. Anstatt das Gerätelayout fest codiert zu haben, kann es über den Gerätebaum geändert werden. Wenn man es einmal verstanden hat, ist das alles wirklich magisch. Der Gerätebaum teilt dem Kernel über den compatible
Parameter auch mit, welchen Treiber er für ein bestimmtes Gerät verwenden soll.
Der Gerätebaum kann je nach Kompilierung des Kernels auf unterschiedliche Weise gespeichert werden. Im Allgemeinen ist die Hierarchie jedoch unter /proc/device-tree
oder zu sehen /sys/firmware/devicetree/base
.
Bei Dingen wie USB-Geräten übernimmt der USB-Treiber alles. Der Kernel verfügt über grundlegenden Code zur Steuerung von Dingen wie Tastaturen und Mäusen. Einige Anbieter haben benutzerdefinierte Treiber, die dann mit dem Gerät ausgeliefert werden.
Module
Für Treiber verwendet der Linux-Kernel etwas namensKernelmodule. Alle Module sind unter zu finden /lib/modules
. Es gibt zwei Arten von Modulen: ladbare Module und integrierte Module. Sie können alle geladenen Module mit dem lsmod
Befehl anzeigen. Wenn der Kernel ein bestimmtes Gerät im Gerätebaum findet oder wenn Sie ein Gerät an ein Peripheriegerät anschließen, prüft er, ob es ein Modul gibt, das er für dieses Gerät laden kann, und das Modul wird zum Treiber für dieses Gerät.
Das Schöne an ladbaren Modulen ist, dass sie das Kernel-Image kleiner halten. Die Module können separat kompiliert werden. Integrierte Module werden in den Kernel kompiliert und erhöhen so die tatsächliche Image-Größe. Sie können Module auch kompilieren und in den Kernel laden, während dieser ausgeführt wird, aber das ist ein ganz anderes Thema.
BSP
Sie kommen zu BSPs (Board Support Package), wenn ein Anbieter den Kernel und eine Reihe spezifischer Module für seine eigene Hardware liefert (dazu gehören der Prozessor und die angeschlossene Hardware). Manchmal nehmen Anbieter Änderungen an vorhandenen Modulen vor oder liefern benutzerdefinierte Module mit dem Kernel. Einige Anbieter nehmen Änderungen am Kernel selbst vor und dieses gesamte benutzerdefinierte Paket wird zum BSP. Dies kommt in der Embedded-Welt häufig vor.
HAL
HAL (Hardware Abstraction Layer) kann synonym zu BSP verwendet werden. Ich habe nicht gesehen, dass es in der Linux-Welt so häufig verwendet wird, aber wenn man sich mit Mikrocontrollern beschäftigt, wird es ziemlich oft verwendet. Im Wesentlichen ist HAL eine Reihe von Bibliotheken, die zum Zugriff auf die Hardware verwendet werden und die die Schnittstelle zur Hardware erheblich vereinfachen. Bei einem WLAN-Chip beispielsweise bietet es Ihnen grundlegende Routinen, um eine Verbindung zu einem AP herzustellen, das Netzwerk zu scannen, einen Zugriffspunkt zu erstellen usw. In diesem Sinne fungiert es als Treiber.