Je suis en train de parcourir le code d’un pilote “tiers” pour essayer / comprendre comment il fonctionne. J’ai jeté un coup d’oeil à des sites tels que celui-ci , alors je comprends en quelque sorte le fonctionnement de base, mais je ne comprends pas le but de #ifdef MODULE
ici. Google n’est pas vraiment une aide, mais je pense que la définition fait référence à un module du kernel? (Je suis aussi complètement nouveau à cela.)
module_init(os_driver_init); #ifdef MODULE module_exit(os_driver_cleanup); #endif
Ma question est la suivante: que se passe-t-il si je supprime la déclaration #ifdef
? Aussi, pourquoi / quand faudrait-il inclure la déclaration #ifdef
?
Dans le kernel Linux, la plupart des pilotes peuvent être soit statiquement liés (intégrés) à l’image du kernel lui-même, soit construits en tant que modules chargés dynamicment (fichiers .ko
).
La macro MODULE
est définie pour un fichier C lors de sa compilation dans le cadre d’un module, et indéfinie lors de sa construction directe dans le kernel.
Le code que vous montrez ne définit que os_driver_cleanup
comme une fonction de sortie de module lors de sa compilation en tant que module. Cependant, cette construction est inutile dans le code du kernel moderne; include/linux/init.h
définit module_exit()
comme une macro dont l’implémentation dépend de #ifdef MODULE
.
Fondamentalement, vous devez toujours fournir une fonction de sortie, et laisser la #ifdef
autour de module_exit()
. Vous devez également marquer votre fonction de sortie avec __exit
, qui contrôlera correctement l’inclusion du code dans votre cas modulaire / non modulaire.
Voici un exemple de code init / exit approprié.
static int __init foo_init(void) { /* Register driver, etc. */ } static void __exit foo_cleanup(void) { /* Unregister driver, etc. */ } module_init(foo_init); module_exit(foo_cleanup);