Welche Gerätetreiber sind im Kernel integriert?


14

Ich habe kürzlich ein vom Hersteller bereitgestelltes Embedded-Linux auf einem Hardwaregerät installiert. Als ich in lsmodder Gerätebefehlszeile lief , war die Antwort leer. Ich wurde zu der Annahme verleitet, dass dies bedeutet, dass die Treiber für die auf dem Gerät ausgeführte Hardware nicht als .ko-Dateien, sondern im Kernel integriert wurden. Meine Frage lautet: Wie läuft dieser Prozess ab?

Wird in späteren Versionen die Unterstützung für gängige Hardware schrittweise in den Kernel integriert, wodurch die .ko-Dateien ersetzt werden? Wird die .ko-Datei lediglich zur Unterstützung neuer Hardware verwendet, für die zum Zeitpunkt der Veröffentlichung keine Treiber für den Kernel integriert waren? In meinem begrenzten Wissen dachte ich, dass alle Hardwaretreiber in Form von .ko-Dateien vorliegen, aber dies ist eindeutig falsch.

Ich bin etwas verwirrt über den gesamten Prozess und wäre dankbar für eine Klärung, da ich das Gefühl habe, dass ich die Situation falsch betrachte.


Antworten:


10

Kerntreiber, die als kritisch für das Laden des Kernels angesehen werden, werden normalerweise in den Kernel integriert, während andere Hardwaretreiber usw. als Module oder .ko- Dateien erstellt werden.

Die .ko- Module werden normalerweise in dem /libVerzeichnis auf Ihrer Root-Partition gespeichert . Der Kernel muss zunächst in der Lage sein, das zugrunde liegende Speichergerät zu erkennen und darauf zuzugreifen, bevor er auf sein Dateisystem zugreifen kann. Man kann also davon ausgehen, dass ein Kernel ohne integrierte SATA / SCSI- und ext2 / 3/4-Unterstützung nicht wirklich startet;)

Sie können die meisten integrierten Kerneltreiber in Modulform umwandeln. Das Ubuntu-Kernel-Team entscheidet, ob die Standardkonfiguration des Linux-Kernel-Teams geändert und zusätzliche integrierte Treiber für die von Ihnen heruntergeladenen Standard-Kernel-Images ein- oder ausgeschlossen werden sollen.

Wenn Sie Ihren eigenen Kernel erstellen, können Sie dasselbe tun:

Bildbeschreibung hier eingeben

  • Im obigen Screenshot ist die * einen integrierten Treiber an, während Mein Modul angezeigt wird.
  • Die Loopback-Geräteunterstützung, die häufig für das Booten eines Systems erforderlich ist, ist standardmäßig integriert.
  • Der Low-Speed-USB-Treiber (USB 1.0) ist ebenfalls standardmäßig integriert, damit Sie von einem USB-Stick booten können. Hier habe ich ihn jedoch in ein Modul geändert.

Danke, das hilft mir sehr. Ich denke, ich werde dies besser verstehen, wenn ich irgendwann einen Kernel-Build von Grund auf für mich selbst mache.
Mathematiker1975

3

Beim Kompilieren eines Kernels müssen Sie konfigurieren, welche Komponenten installiert werden. Darüber hinaus können Sie entscheiden, ob sie in den Kernel integriert sind oder ob es sich um ein Modul handelt .

Zum Beispiel verwenden viele Leute das ext2-Dateisystem in ihrem / boot Partition. Aus diesem Grund muss der Kernel in der Lage sein, beim Booten ext2-Dateisysteme zu lesen. Dazu wird das ext2-Modul in den Kernel selbst eingebaut.

Stellen Sie sich nun die Anzahl der verfügbaren Module vor. Es würde keinen Sinn machen, sie alle in Ihren Kernel zu integrieren, oder? Aus diesem Grund können Sie diese als separate .ko- Module erstellen und nach Belieben laden.


1
Ja, dein letzter Absatz hat meine Frage motiviert, ehrlich zu sein. Vielen Dank für die Antwort
Mathematiker1975

1

Dies hängt davon ab, wie Sie Ihren Build des Linux-Kernels konfiguriert haben.

Innerhalb eines Kompilierungsprozesses können Sie normalerweise:

  • Kompilieren Sie den Kernel mit oder ohne Modulunterstützung (oft mit Modulunterstützung)
  • Kompilieren Sie einen Treiber als Modul oder als integrierte Software direkt in den Kernel

Um zu verstehen, was eine .ko-Datei für /programming/10476990/difference-between-o-and-ko-file ist

Der Grund, warum Sie eine leere Ausgabe haben, lsmodist, dass Sie einen monolithischen Kernel haben.

Eine schnelle Möglichkeit zum Auflisten aller Module (sofern vorhanden) besteht darin, diesen Befehl auszuführen

find /lib/modules/*/ -type f -iname '*.ko' | less

Beachten Sie die Verwendung von less, können Sie jeden Pager verwenden, den Sie möchten, oder die Ausgabe umleiten, wo Sie möchten.


Auf einem Kernel, der ohne Modulunterstützung konfiguriert ist (wie meiner scheint), kann ich keine Treiber in Form von .ko-Dateien installieren, um zusätzliche Hardware zu verwenden?
Mathematiker1975

Ja, grundsätzlich müssen Sie es aus dem Quellcode neu kompilieren. Wenn Sie Treiber bearbeiten und / oder hinzufügen möchten, müssen Sie es neu .configerstellen , verwenden Sie möglicherweise nur die gleiche Datei und ändern Sie sie nach Bedarf.
user827992

Um dies zu tun, müsste ich den Kernel-Quellcode vom Hersteller erhalten, ihn selbst mit den korrekten Änderungen an der .config-Datei kompilieren und dann andere Treiber installieren.
Mathematiker1975

Es hängt davon ab, ob er einen Vanille-Kernel verwendet hat (ohne mehr als den ursprünglichen Quellcode). Sie können nur die .config-Datei verwenden und denselben Kernel nur mit Ihrem PC reproduzieren. Wenn er jedoch einen Vanille-Kernel + einige Patches oder Modifikationen verwendet hat Wenn Sie diese zusätzlichen Informationen benötigen, kann ein benutzerdefiniertes Makefile ebenso als relevante Variable angesehen werden wie alle anderen Änderungen an der Standard-Toolchain und im Allgemeinen am Standard-Build-Prozess.
user827992

Ich habe die Erfahrung gemacht, dass Module aus Geschwindigkeits- und Größengründen für Embedded Linux deaktiviert sind und dass die Kernel für solche Geräte häufig nicht in der Baumstruktur befindliche Treiber enthalten und auf dem PC eines zufälligen Mitarbeiters ohne Quellcodeverwaltung erstellt werden. Viel Glück damit.
Stephen M. Webb

0

Siehe den Inhalt der Datei /lib / modules / $ (uname -r) /modules.builtin

zB um nach einem bestimmten Modul zu suchen

grep <module> /lib/modules/$(uname -r)/modules.builtin

Dokumentation / kbuild / kbuild.txt

modules.builtin
--------------------------------------------------
This file lists all modules that are built into the kernel. This is used
by modprobe to not fail when trying to load something builtin.

??? Ich bin nicht sicher, was das OP tun soll. Soll er die erste Linie im Terminal fahren? Dies könnte die Antwort sein, aber würden Sie bitte etwas näher darauf eingehen?
anonymous2

0
ls /sys/module

scheint alle eingebauten und externen Module zu enthalten.

Es scheint aber auch einige Einträge zu enthalten, die eigentlich keine Module sind: /unix/225706/are-modules-listed-under-sys-module-all-the-loaded-modules

TODO: Lies die Quelle und verstehe genauer, was dort abgelegt wird.

Der Vorteil dieser Methode ist, dass Sie sich nicht darauf verlassen müssen, dass Sie die Kernel-Konfiguration unter /bootoder finden /proc/config.gz.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.