web-dev-qa-db-fra.com

Difficile de comprendre l'utilisation de MODULE_DEVICE_TABLE (usb, id_table)

J'ai du mal à comprendre l'utilisation exacte de MODULE_DEVICE_TABLE(usb, id_table)

AFAIK cela générera les fichiers de carte qui seront utilisés plus tard par modprobe chaque fois qu'un nouveau périphérique est inséré, il le comparera avec ces fichiers de carte et chargera le module s'il correspond.

Mais mon malentendu est "le module n'est-il pas chargé de toute façon?"

Je veux dire que je l'ai déjà chargé quand je l'ai fait insmod module-name. ou est-ce que je manque quelque chose?

20
silentnights

Il est généralement utilisé pour prendre en charge le branchement à chaud, en chargeant/insérant le pilote d'un périphérique s'il n'est pas déjà chargé.

Il y a une question similaire ici: Détecter la présence d'un périphérique lorsqu'il est branché à chaud sous Linux

(De mes ans)

Cela fonctionne comme suit:

  1. Chaque pilote du code expose son ID de fournisseur/périphérique à l'aide de:

      MODULE_DEVICE_TABLE(of, omap_mcspi_of_match);
    
  2. Au moment de la compilation, le processus de génération extrait cette information de tous les pilotes et prépare une table de périphériques.

  3. Lorsque vous insérez le périphérique, la table des périphériques est référencée par le noyau et si une entrée correspondant à l'ID de périphérique/fournisseur du périphérique ajouté est trouvée, son module est chargé et initialisé.

22
brokenfoot

Selon les pilotes de périphériques Linux:

  1. MODULE_DEVICE_TABLE Est utilisé pour générer des fichiers de carte par le programme depmod;
  2. Lorsque le périphérique est branché à chaud, le pilote de bus génère un événement de connexion à chaud. Le noyau appelle /sbin/hotplug Avec l'ensemble de variables d'environnement approprié;
  3. Compte tenu des fichiers cartographiques et des informations de l'environnement, /sbin/hotplug Décide du module à charger et le charge réellement. Si le module est déjà chargé, c'est OK.

Je dois mentionner à nouveau que ce mécanisme garantit simplement que le module nécessaire est en place lorsque l'appareil est branché. Cela ne lie pas le module avec cet appareil ou quoi que ce soit d'autre. Charge simplement le module.

Pour vérifier si le pilote est OK pour un périphérique spécifique, la fonction match() de bus_type Est utilisée.

11
Alexey Shmalko

Voici comment je comprends les choses [compatible Xbuntu 14.04].

Une fois que nous avons écrit un module, nous pouvons le charger manuellement ou automatiquement.

  • Manuellement -> insmod modulename.ko ou modprob modulename.ko
  • Automatiquement-> Il existe plusieurs façons.

    1. copier dans / lib/modules/`uname -r`/kernel/modulename.ko et mettre à jour /etc/modules. Le système chargera le module lors du démarrage.

    2. Écrivez un script/une commande pour charger le module.ko pour un harware spécifique add/change/remove événement dans une règle de udev/etc/udev/rules.d/10-local.rules. Vous pouvez à la fois charger/décharger en utilisant cette méthode.

    3. Codez votre module avec MODULE_DEVICE_TABLE enregistrement. Chargez ensuite votre modulename.ko une fois et exécutez la commande depmod [Sudo depmod -a] pour ajouter le nouveau module à /lib/modules/3.16.0-34-generic/modules.alias/lib/modules/3.16.0-34-generic/modules.dep des dossiers. Comme je le sais, le système ne se chargera que si le module n'est pas chargé.

Vous pouvez surveiller le chargement/déchargement de modules à l'aide d'événements udev en utilisant:

moniteur udevadm

commander.

6
Chand Priyankara