Wie geht der Linux-Kernel mit Treibern um?

5

Ich habe gerade gelesen, wie Linux mit Hardwaretreibern umgeht. Anscheinend sind die meisten Hardwaretreiber im Linux-Kernel vorkompiliert. Ich habe einige Fragen dazu ...

Wenn der Linux-Kernel Hardwaretreiber für fast jedes Hardwaregerät enthält und ein Laptop, der unter Linux läuft, nur eine bestimmte Anzahl von Hardwaregeräten hat, was ist dann mit all den redundanten Hardwaretreibern, die der Linux-Kernel hat? Ist es nicht eine Verschwendung von Ressourcen, all diese Treiber im Kernel zu belassen und im System am Laufen zu halten, auch wenn wir sie nicht verwenden?

Uday Kumar
quelle
2
Nicht alle Treiber werden beim Booten ausgeführt, sondern nur diejenigen mit zugehöriger Hardware.
Pilot6
2
Gerätetreiber werden zu Modulen kompiliert, die nur dann in den Kernel geladen werden, wenn die entsprechende Hardware vorhanden ist.
Solstice
1
Für diejenigen, die die Frage auf Eis gelegt haben, war sie weder zu weit gefasst, noch gibt es viele gute Antworten. Ich habe die Frage ganz gut verstanden. Bitte entfernen Sie den Laderaum.
Kurt Fitzner
1
Uday Kumar: Dein Beitrag besteht aus zwei Teilen. Ich schlage vor, # 2 zu entfernen, um die Energieeffizienz zu verbessern - dies ist eine separate Frage. Sie können es separat veröffentlichen (aber suchen Sie bitte zuerst - auch wenn Sie keine Antwort finden, können Sie es auf etwas Spezifischeres eingrenzen). Teil # 1 scheint mir jedoch eine perfekt abgestimmte, themenbezogene Frage zu sein. @ MarkKirby Wie zählen Sie sechs? Lesen Sie "Was ist mit all den redundanten Hardwaretreibern, die der Linux-Kernel hat?" und "Ist es nicht eine Verschwendung von Ressourcen [...]" als separate Fragen? Dieser Absatz sieht für mich wie eine einzige, gut formulierte Frage aus.
Eliah Kagan
1
@ MarkKirby Ich glaube wirklich nicht, dass die ersten drei nummerierten Fragen im ursprünglichen Beitrag separate Fragen waren. Sie stellten eine Erläuterung und Klärung der ersten Frage dar. Dass sie alle wie eine einzige Frage beantwortet wurden, ohne dass sie separat angesprochen werden mussten , bestärkt mich in meiner Überzeugung, dass sie nur eine Frage stellen. (Im Gegensatz dazu die letzte Frage ist adressierte separat in dieser Antwort, und nicht in der Tiefe, und ich denke , es ist am besten von diesem Posten entfernt wird .) Uday Kumar: Ich denke immer noch , können wir dies wieder öffnen , wenn (was jetzt beziffert) # 2 herausgeschnitten.
Eliah Kagan

Antworten:

9

Zuerst etwas Geschichte. In den früheren Tagen von Linux wurden Gerätetreiber tatsächlich direkt in den Kernel kompiliert. Tatsächlich ist es immer noch möglich, Treiber direkt zu kompilieren, und in vielen Kerneln sind auf diese Weise möglicherweise noch einige sehr häufige Treiber enthalten. Die Art und Weise, wie es funktionierte, war, dass der mit den frühen Distributionen wie SLS oder Slackware gelieferte generische Kernel praktisch jeden Treiber, den der unterstützte Kernel unterstützte, direkt darin kompilierte, so dass er auf einer möglichst großen Vielfalt von Hardware funktionieren würde. Selbst dann war es nicht möglich, sie alle einzufügen, da einige von ihnen nicht miteinander kompatibel sind. Nachdem Sie Ihr System installiert haben, würden Sie Ihren eigenen Kernel erstellen und die Konfiguration sorgfältig durchgehen, um sicherzustellen, dass Sie die richtigen Treiber für alles enthalten, was Ihr Computer hatte. Manchmal musste man Header-Dateien im Treiber manuell bearbeiten, um die Unterstützung für Oddball-Hardware einzuschließen - eine Ethernet-Karte, die einen bestimmten Chipsatz verwendete, verwendete die Treiber des Chipsatzes, aber manchmal gab es komische Arten, wie sie implementiert wurden. Dann würden Sie kompilieren, installieren und hoffentlich nach einem Neustart einen benutzerdefinierten Kernel nur für Ihren Computer erstellen lassen. Schlank und optimiert. In der Realität haben Sie diesen Vorgang im Allgemeinen mehrmals wiederholt, einschließlich fehlender Elemente, der Unterstützung für ein vergessenes Dateisystem oder einer Änderung der Einstellungen. Spülen und wiederholen. und hoffentlich hatten Sie nach einem Neustart einen benutzerdefinierten Kernel nur für Ihren Computer erstellt. Schlank und optimiert. In der Realität haben Sie diesen Vorgang im Allgemeinen mehrmals wiederholt, einschließlich fehlender Elemente, der Unterstützung für ein vergessenes Dateisystem oder einer Änderung der Einstellungen. Spülen und wiederholen. und hoffentlich hatten Sie nach einem Neustart einen benutzerdefinierten Kernel nur für Ihren Computer erstellt. Schlank und optimiert. In der Realität haben Sie diesen Vorgang im Allgemeinen mehrmals wiederholt, einschließlich fehlender Elemente, der Unterstützung für ein vergessenes Dateisystem oder einer Änderung der Einstellungen. Spülen und wiederholen.

Diese Zeiten sind zum Glück lange vorbei. Der Kernel unterstützt seit sehr langer Zeit ladbare Module. Hierbei handelt es sich um Kerneltreiber, die so kompiliert wurden, dass sie zu einer Art gemeinsam genutzter Bibliothek werden, die bei Bedarf geladen oder entladen werden kann. Nun, wie ein Kernel bootet, haben Sie die Kerneldatei selbst und ein kleines komprimiertes Dateisystem (siehe initramfs auf Wikipedia), das alle Kernelmodule enthält, die der Kernel unterstützt. Der Kernel lädt, findet sein ursprüngliches Dateisystem und kann dann mit dem Laden aller benötigten Treiber beginnen.

Das bisschen Geschichte überspringt eine Menge Arbeit und schwitzt auf dem Weg. Dazwischen die Verwendung aller kompilierten Treiber in einem riesigen monolithischen Kernel und ein vollautomatisches Treiberladesystem, das wir heute haben, waren alle Schritte auf dem Weg, auf dem wir Module hatten, die explizit geladen werden mussten, das halbautomatische Laden für einige usw usw.

Da moderne Kernel die große Mehrheit der benötigten Treiber nach Bedarf laden, belegen im Kernel einer modernen Linux-Distribution nur wenige redundante Hardwaretreiber Ressourcen.

Kurt Fitzner
quelle