Es wird normalerweise verwendet, um Hot-Plugging zu unterstützen, indem der Treiber für ein Gerät geladen/eingefügt wird, falls er noch nicht geladen ist.
Hier gibt es eine ähnliche Frage:Erkenne das Vorhandensein eines Geräts, wenn es unter Linux angeschlossen ist
(Aus meiner Ans)
Es funktioniert wie folgt:
-
Jeder Treiber im Code macht seine Hersteller-/Geräte-ID mit:
verfügbarMODULE_DEVICE_TABLE(of, omap_mcspi_of_match);
-
Zur Kompilierzeit extrahiert der Erstellungsprozess diese Informationen aus allen Treibern und bereitet eine Gerätetabelle vor.
-
Wenn Sie das Gerät einfügen, verweist der Kernel auf die Gerätetabelle, und wenn ein Eintrag gefunden wird, der mit der Geräte-/Hersteller-ID des hinzugefügten Geräts übereinstimmt, wird sein Modul geladen und initialisiert.
Laut Linux Device Drivers:
MODULE_DEVICE_TABLE
wird verwendet, um Kartendateien vondepmod
zu generieren Programm;- Wenn das Gerät Hot-Plug-fähig ist, generiert der Bustreiber ein Hotplug-Ereignis. Kernel ruft
/sbin/hotplug
auf mit entsprechenden gesetzten Umgebungsvariablen; - Gegebene Kartendateien und Informationen aus der Umgebung,
/sbin/hotplug
entscheidet, welches Modul geladen werden soll, und lädt es tatsächlich. Wenn das Modul bereits geladen ist, ist es in Ordnung.
Ich sollte noch einmal erwähnen, dass dieser Mechanismus nur sicherstellt, dass das benötigte Modul vorhanden ist, wenn das Gerät angeschlossen ist. Das verknüpft das Modul nicht mit diesem Gerät oder irgendetwas anderem. Lädt nur das Modul.
Um zu überprüfen, ob der Treiber für ein bestimmtes Gerät in Ordnung ist, match()
Funktion von bus_type
verwendet wird.
So verstehe ich die Dinge [Xbuntu 14.04 kompatibel].
Sobald wir ein Modul geschrieben haben, können wir es entweder manuell oder automatisch laden.
- Manuell ->
insmod
Modulname.ko odermodprob
Modulname.ko -
Automatisch -> Es gibt mehrere Möglichkeiten.
-
kopieren Sie nach /lib/modules/`uname -r`/kernel/modulename.ko und aktualisieren Sie
/etc/modules
. Das System lädt das Modul während des Bootens. -
Schreiben Sie ein Skript/einen Befehl zum Laden von module.ko für eine bestimmte Hardware
add
/change
/remove
Ereignis in einemudev
Regel/etc/udev/rules.d/10-local.rules
. Mit dieser Methode können Sie sowohl laden als auch entladen. - Codieren Sie Ihr Modul mit
MODULE_DEVICE_TABLE
Anmeldung. Laden Sie dann einmal Ihre modulename.ko und führen Siedepmod
aus Befehl [sudo depmod -a
], um das neue Modul zu/lib/modules/3.16.0-34-generic/modules.alias
hinzuzufügen/lib/modules/3.16.0-34-generic/modules.dep
Dateien. Wie ich weiß, wird das System nur geladen, wenn das Modul nicht geladen ist.
-
Sie können das Laden/Entladen von Modulen mithilfe von udev-Ereignissen überwachen, indem Sie :
verwendenudevadm-Monitor
Befehl.