Di solito viene utilizzato per supportare l'hot plug, caricando/inserendo il driver per un dispositivo se non è già caricato.
C'è una domanda simile qui:Rileva la presenza di un dispositivo quando è collegato a caldo in Linux
(Dalla mia risposta)
Funziona come segue:
-
Ogni driver nel codice espone il proprio ID fornitore/dispositivo utilizzando:
MODULE_DEVICE_TABLE(of, omap_mcspi_of_match);
-
Al momento della compilazione il processo di compilazione estrae queste informazioni da tutti i driver e prepara una tabella dei dispositivi.
-
Quando inserisci il dispositivo, il kernel fa riferimento alla tabella dei dispositivi e se viene trovata una voce che corrisponde all'id del dispositivo/fornitore del dispositivo aggiunto, il suo modulo viene caricato e inizializzato.
Secondo Linux Device Drivers:
MODULE_DEVICE_TABLE
è usato per generare file mappa dadepmod
programma;- Quando il dispositivo è collegato a caldo, il driver del bus genera un evento hotplug. Il kernel chiama
/sbin/hotplug
con opportune variabili ambientali impostate; - Dati i map file e le informazioni dall'ambiente,
/sbin/hotplug
decide quale modulo caricare e lo carica effettivamente. Se il modulo è già caricato, va bene.
Dovrei menzionare ancora una volta che questo meccanismo garantisce solo che il modulo necessario sia in posizione quando il dispositivo è collegato. Questo non collega il modulo con quel dispositivo o altro. Carica solo il modulo.
Per verificare se il driver è OK per un dispositivo specifico, match()
funzione da bus_type
viene utilizzato.
Ecco come capisco le cose [compatibile con Xbuntu 14.04].
Una volta scritto un modulo, possiamo caricarlo manualmente o automaticamente.
- Manualmente ->
insmod
modulename.ko omodprob
nomemodulo.ko -
Automaticamente-> Esistono diversi modi.
-
copia in /lib/modules/`uname -r`/kernel/nomemodulo.ko e aggiorna
/etc/modules
. Il sistema caricherà il modulo durante l'avvio. -
Scrivi uno script/comando per caricare module.ko per uno specifico harware
add
/change
/remove
evento in unudev
regola/etc/udev/rules.d/10-local.rules
. Puoi eseguire sia il caricamento che lo scaricamento utilizzando questo metodo. - Codifica il tuo modulo con
MODULE_DEVICE_TABLE
registrazione. Quindi carica il tuo modulename.ko una volta ed eseguidepmod
comando [sudo depmod -a
] per aggiungere il nuovo modulo a/lib/modules/3.16.0-34-generic/modules.alias
/lib/modules/3.16.0-34-generic/modules.dep
File. Come so, il sistema verrà caricato solo se il modulo non è caricato.
-
Puoi monitorare il caricamento/scaricamento del modulo usando gli eventi udev usando :
monitor udevadm
comando.