Ein Kernelmodul ist ein kompilierter Code, der zur Laufzeit in den Kernel eingefügt werden kann, z. B. mit insmod
oder modprobe
.
Ein Treiber ist ein Stück Code, der im Kernel ausgeführt wird, um mit einem Hardwaregerät zu kommunizieren. Es "treibt" die Hardware an. Fast jeder Hardware-Komponente Ihres Computers ist ein Treiber zugeordnet.¹ Ein großer Teil eines laufenden Kernels ist der Treibercode.²
Ein Treiber kann statisch in die Kerneldatei auf der Festplatte eingebaut werden.³ Ein Treiber kann auch als Kernelmodul eingebaut werden, damit er später dynamisch geladen werden kann. (Und dann vielleicht entladen.)
Üblicherweise werden Treiber nach Möglichkeit als Kernelmodule erstellt, anstatt sie statisch mit dem Kernel zu verknüpfen, da dies mehr Flexibilität bietet. Es gibt jedoch gute Gründe, dies nicht zu tun:
Manchmal ist ein bestimmter Treiber unbedingt erforderlich, um das System hochzufahren. Das passiert aufgrund der initrd- Funktion nicht so oft, wie Sie sich vorstellen können .
Statisch erstellte Treiber können genau das sein, was Sie in einem System mit statischem Gültigkeitsbereich möchten, z. B. einem eingebetteten System . Das heißt, wenn Sie im Voraus genau wissen, welche Treiber immer benötigt werden und dass sich dies nie ändern wird, haben Sie einen guten Grund, sich nicht mit dynamischen Kernelmodulen zu beschäftigen.
Wenn Sie Ihren Kernel statisch erstellen und die Funktion zum Laden dynamischer Linux-Module deaktivieren, verhindern Sie, dass der Kernelcode zur Laufzeit geändert wird. Dies bietet zusätzliche Sicherheit und Stabilität auf Kosten der Flexibilität.
Nicht alle Kernelmodule sind Treiber. Eine relativ neue Funktion im Linux-Kernel ist beispielsweise, dass Sie einen anderen Prozess-Scheduler laden können . Ein weiteres Beispiel ist, dass die komplexeren Hardwaretypen häufig mehrere generische Schichten aufweisen, die sich zwischen dem Hardwaretreiber auf niedriger Ebene und dem Benutzerland befinden, z. B. der USB-HID-Treiber , der ein bestimmtes Element des USB-Stacks unabhängig von der zugrunde liegenden Hardware implementiert.
Nebenbei:
Eine Ausnahme von dieser breiten Aussage ist der CPU - Chip, der keine „Fahrer“ hat per se . Ihr Computer enthält möglicherweise auch Hardware, für die Sie keinen Treiber haben.
Der Rest des Codes in einem Betriebssystemkernel stellt allgemeine Dienste wie Speicherverwaltung , IPC , Zeitplanung usw. bereit. Diese Dienste können in erster Linie Benutzeranwendungen bedienen , wie in den zuvor verknüpften Beispielen, oder sie können interne Dienste sein, die von Treibern oder anderen internen Diensten verwendet werden. Kernel-Infrastruktur.
Der in /boot
, in den Arbeitsspeicher geladen beim Booten von der Bootloader zu Beginn des Startvorgangs .
man lspci
: "-k Zeigt die Kernel- Treiber an, die jedes Gerät und auch die dazu fähigen Kernel- Module handhaben ." Sie können dies so lesen: "Zeigen Sie den Treiber an, der gerade das Gerät bedient, und auch alle Module, die damit umgehen können / sollen ."Um Ihre spezifische Frage zur
lspci
Ausgabe zu beantworten , gibt die Zeile "Kerneltreiber" an, welcher Treiber aktuell an die Karte gebunden ist, in diesem Fall der proprietärenvidia
Treiber. In der Zeile "Kernelmodule" sind alle Treiber aufgeführt, von denen bekannt ist, dass sie an diese Karte gebunden werden können. Hier zeigt der proprietäre Treiber einen anderen Namen an, wahrscheinlich weillspci
der Treiber und sein Dateiname im Vergleich zum im Treiber selbst codierten Namen gefunden wurden.quelle
man lspci
- es sagt genau, was Sie geschrieben haben.Nach diesem netten Tutorial :
Wenn wir also versuchen, einen Baum zu zeichnen, werden wir einen "Gerätetreiber" haben, der vom (erweiterten) Modul erbt und der spezifischere Eigenschaften hat, zwischen denen wir "Zugriff auf Hardware" finden ...
quelle
Ein Kernelmodul ist möglicherweise überhaupt kein Gerätetreiber.
"Kerneltreiber" ist kein genau definierter Begriff, aber lassen Sie es uns versuchen.
Dies ist ein Kernelmodul, das keine Hardware antreibt und daher nicht als "Gerätetreiber" angesehen werden kann:
Nach dem Build können Sie es verwenden mit:
und es druckt
hello init
zudmesg
.Es gibt jedoch Kernelmodule, die keine Gerätetreiber sind, aber tatsächlich nützlich sind, z. B. Module, die Kernel-Debugging- / Leistungsinformationen bereitstellen.
Gerätetreiber sind in der Regel auch Kernelmodule.
Ein Beispiel für etwas, das ein "Gerätetreiber" ist, ist etwas schwieriger zu generieren, da es eine Hardware zum Fahren erfordert und Hardwarebeschreibungen in der Regel kompliziert sind.
Mit QEMU oder anderen Emulatoren können wir jedoch Softwaremodelle aus realer oder vereinfachter Hardware erstellen. Dies ist eine hervorragende Möglichkeit, um zu lernen, wie man mit Hardware spricht. Hier ist ein einfaches Beispiel eines minimalen PCI-Gerätetreibers: https://github.com/cirosantilli/linux-kernel-module-cheat/blob/6788a577c394a2fc512d8f3df0806d84dc09f355/kernel_module/hello.c
Wir sehen dann, dass es in x86 bei der Kommunikation mit der Hardware darauf ankommt,
in
undout
Anweisungen, z. B. https://stackoverflow.com/questions/3215878/what-are-in-out-instructions-in-x86-used-for/33444273#33444273Diese Operationen können im Allgemeinen nicht vom Userland aus durchgeführt werden, wie unter: Was ist der Unterschied zwischen User Space und Kernel Space? Es gibt jedoch einige Ausnahmen: https://stackoverflow.com/questions/7986260/linux-interrupt-handling-in-user-space .
Der Kernel bietet dann APIs auf höherer Ebene, um solche Hardware-Interaktionen einfacher und portabler zu machen:
request_irq
Interrupts zu behandelnioreadX
und IO-Speicherzuordnungquelle
Meine Antwort wird mit Jim gehen. Ein Kernel-Treiber ist ein Programm (Kernel-Modul), mit dem ein Teil der Hardware angesteuert wird. Die lspci-Ausgabe besagt, dass nvidia der Kerneltreiber ist, da es das
loaded
Modul für das Gerät ist. Zusammen mit ihm kommen andere verfügbare Kernelmodule zur Verfügung.Ich werde hinzufügen, dass die Befehle in Linux zum Auflisten und Entfernen von Treibern
lsmod
undrmmod
sind. Was sagt Listenmodul und Modul entfernen.quelle
Alle Treiber sind Module. Nicht alle Module sind Treiber.
Module können zur Laufzeit eingefügt werden. Module / Treiber können zusammen mit dem Kernel auch statisch kompiliert werden.
Typisches Modul init hat
Das gleiche Modul kann zum Treiber gemacht werden
quelle