2014-10-01 13 views
6

Attualmente sto esaminando il codice di un driver di "terze parti" nel tentativo di capire/imparare come funziona. Ho dato un'occhiata a siti come this one, quindi capisco come funziona la premessa di base, ma non capisco lo scopo di #ifdef MODULE qui. Google non è davvero di grande aiuto, ma penso che la definizione si riferisca ad un modulo del kernel? (Sono anche completamente nuovo a questo.)Scopo di `#ifdef MODULE` attorno a module_exit()?

module_init(os_driver_init); 
#ifdef MODULE 
module_exit(os_driver_cleanup); 
#endif 

La mia domanda è: cosa succede se mi tolgo la dichiarazione #ifdef? Inoltre, perché/quando sarebbe necessario includere la dichiarazione #ifdef?

+1

Esiste un'alternativa (più in basso nel codice) 'module_exit (...)' line? Può darsi che vengano chiamate funzioni alternative e il 'ifdef MODULE' controlli questo – chrisb2244

+0

Forse' MODULE' deve essere definito quando il driver viene compilato staticamente nel kernel? http://www.fsl.cs.sunysb.edu/kernel-api/re02.html – user694733

+0

Puoi collegarti a questo codice di driver di "terze parti"? Il '# ifdef' che stai mostrando non dovrebbe essere più lì. –

risposta

6

Nel kernel di Linux, la maggior parte dei driver può essere collegata staticamente (incorporata) all'immagine del kernel stesso o costruita come moduli caricati dinamicamente (file .ko).

La macro MODULE è definita per un file C quando viene compilata come parte di un modulo e indefinita quando viene costruita direttamente nel kernel.

Il codice che stai visualizzando definisce solo os_driver_cleanup come una funzione di uscita modulo quando viene compilato come modulo. Tuttavia, questo costrutto non è necessario nel codice del kernel moderno; include/linux/init.h definisce module_exit() come una macro, la cui implementazione dipende da #ifdef MODULE.

In genere, è sempre necessario fornire una funzione di uscita e lasciareintorno a module_exit(). Dovresti inoltre contrassegnare la tua funzione di uscita con __exit, che controllerà correttamente l'inclusione del codice per il tuo nel caso modulare/non modulare.

Ecco un esempio di codice di init/exit corretto.

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