But de `#ifdef MODULE` autour de module_exit ()?

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);