GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Es ist schwierig, die Verwendung von MODULE_DEVICE_TABLE (usb, id_table) zu verstehen

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:

  1. Jeder Treiber im Code macht seine Hersteller-/Geräte-ID mit:

    verfügbar
      MODULE_DEVICE_TABLE(of, omap_mcspi_of_match);
    
  2. Zur Kompilierzeit extrahiert der Erstellungsprozess diese Informationen aus allen Treibern und bereitet eine Gerätetabelle vor.

  3. 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:

  1. MODULE_DEVICE_TABLE wird verwendet, um Kartendateien von depmod zu generieren Programm;
  2. Wenn das Gerät Hot-Plug-fähig ist, generiert der Bustreiber ein Hotplug-Ereignis. Kernel ruft /sbin/hotplug auf mit entsprechenden gesetzten Umgebungsvariablen;
  3. 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 oder modprob Modulname.ko
  • Automatisch -> Es gibt mehrere Möglichkeiten.

    1. 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.

    2. Schreiben Sie ein Skript/einen Befehl zum Laden von module.ko für eine bestimmte Hardware add /change /remove Ereignis in einem udev Regel /etc/udev/rules.d/10-local.rules . Mit dieser Methode können Sie sowohl laden als auch entladen.

    3. Codieren Sie Ihr Modul mit MODULE_DEVICE_TABLE Anmeldung. Laden Sie dann einmal Ihre modulename.ko und führen Sie depmod 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 :

verwenden

udevadm-Monitor

Befehl.


Linux
  1. Wie finde ich das Kernel-Modul für ein bestimmtes Gerät?

  2. Verständnis der Zeitstempel von Mac-Dateien

  3. Gerät für Entwicklung einrichten (???????????? keine Berechtigungen)

  4. Änderungen der Parameter des Kernelmoduls (unter Verwendung von /sys/module)

  5. Holen Sie sich den Stromverbrauch eines USB-Geräts

So ermitteln Sie die Bandbreitennutzung von USB-Geräten unter Linux

Timekpr – Kontrollieren Sie die Computernutzung von Benutzerkonten

Steuern Sie die RAM- und CPU-Nutzung durch Kodi in Echtzeit

Verstehen des Zeitbefehls in Linux

Verstehen der empfohlenen optimierten Profile von RedHat

Wie sind CPU-Zeit und CPU-Auslastung gleich?