Wo lädt modprobe einen Treiber, den udev anfordert?


7

Nehmen wir ein Szenario, in dem ein Linux-System gestartet wurde und ordnungsgemäß ausgeführt wird. Ein Benutzer kommt vorbei und schließt ein USB-Speichergerät an.

Die Abfolge der Ereignisse ist in der folgenden Abbildung dargestellt:

Geben Sie hier die Bildbeschreibung ein

Wo lädt modprobe seinen Treiber? Wird der Treiber für das angeforderte Gerät gefunden, /sys/bus/driversnachdem modprobe es geladen hat oder vorher?

Was ich hier feststellen möchte, ist die Beziehung zwischen Einträgen in /sys/und den Ereignissen, die in der obigen Grafik auftreten.

Antworten:


6

Die Ereignismeldung enthält Informationen zum Gerät ( Beispiel ). Diese Informationen enthalten eine registrierte Hersteller- und Modellidentifikation für Geräte, die an Busse wie PCI und USB angeschlossen sind. Udev analysiert diese Ereignisse und erstellt einen Modulnamen mit fester Form, an den es übergeben wird modprobe. modprobesucht unter /lib/modules/VERSIONnach einer aufgerufenen Datei, depmod.aliasdie bei der Installation des Kernels generiert wird und die die Modulnamen mit fester Form den tatsächlichen Dateinamen der Treibermodule zuordnet. Siehe Werden Treibermodule automatisch geladen und entladen? Für weitere Details zum Prozess - diese Antwort beschreibt die früheren Tage, als der Kernel modprobedirekt aufgerufen wurde , aber die Funktionsweise modprobeund die Modul-Aliase haben sich nicht geändert.

Siehe auch Michael Opdenackers Präsentation „Hotplugging with udev“, die weitere Beispiele enthält und andere Aspekte der Geräteverwaltung mit udev beschreibt, sowie die Linux-Anleitung von Grund auf neu, die einen Abschnitt zur Definition der Modulnamen in fester Form enthält.

modprobeLädt ein Modul durch Aufrufen des init_moduleSystemaufrufs. Es interagiert in keiner Weise mit sysfs. Wenn das Modul geladen ist, erstellt der Kernel einen Eintrag dafür in /sys/module. Jeder Eintrag, der an anderer Stelle in sysfs angezeigt wird, hängt vom Code im Modul ab (z. B. ruft ein Modul mit einem Treiber für einen USB-Gerätetyp einen generischen USB-Supportcode auf, unter dem ein Eintrag hinzugefügt wird /sys/bus/usb/drivers).


Vielen Dank für die Antwort, aber sie beantwortet meine ursprüngliche Frage nicht. Bevor ich danach gefragt habe, habe ich mir tatsächlich Michaels Präsentation und andere von Ihnen bereitgestellte Links angesehen. Ich habe auch Patricks Mochels Artikel über sysfs gelesen. Ich muss entweder etwas verpasst haben oder es wurde in keiner der Quellen beschrieben, die ich bisher durchgesehen habe. Wenn modprobe das Kernelmodul dynamisch lädt, wird dieses Modul (Treiber) dann im /sys/bus/driversVerzeichnis angezeigt ? Kommuniziert modprobe auch über den Netlink-Socket mit dem Kernel? Kommuniziert es zurück zu sysfs?
Shady Programmer

2
Die Fragen in Ihrem Kommentar entsprechen nicht Ihren Fragen in Ihrer ersten Frage! Aber ich habe meine Antwort bearbeitet, um sie trotzdem anzusprechen. Nein, modprobe kommuniziert nicht über netlink oder sysfs (beide Funktionen sind jünger als das Laden von Modulen), sondern ruft den init_moduleSystemaufruf auf.
Gilles 'SO - hör auf böse zu sein'

Danke, jetzt ist alles klar! Außerdem - ja, ich habe in meinem vorherigen Kommentar zusätzlich zu der ursprünglichen Frage zwei weitere verwandte Fragen gestellt, da Sie anscheinend ziemlich gut informiert waren. Vielen Dank, dass Sie diese ebenfalls beantwortet haben. Jetzt, wo meine Frage beantwortet ist, kann ich ruhig schlafen, zumindest für einen weiteren Tag ...
Shady Programmer
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.