2014-10-01 4 views
6

Ich schaue gerade durch den Code eines "Drittanbieter" -Treibers in einem Versuch herauszufinden/zu lernen, wie es funktioniert. Ich habe mir Websites wie this one angesehen, also verstehe ich irgendwie, wie die Grundvoraussetzung funktioniert, aber ich verstehe den Zweck von #ifdef MODULE hier nicht. Google ist nicht wirklich viel Hilfe, aber ich denke die Definition bezieht sich auf ein Kernel-Modul? (Ich bin auch auf diese völlig neu.)Zweck von `#ifdef MODUL` um module_exit()?

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

Meine Frage ist, was passiert, wenn ich die #ifdef Anweisung entfernen? Auch, warum/wann wäre es notwendig, die #ifdef Anweisung einzuschließen?

+1

Gibt es eine Alternative (weiter unten im Code) 'module_exit (...)' line? Es kann sein, dass alternative Funktionen aufgerufen werden, und das 'ifdef MODUL' steuert dies – chrisb2244

+0

Vielleicht' MODULE' definiert werden soll, wenn der Treiber statisch in Kernel kompiliert wird? http://www.fsl.cs.sunysb.edu/kernel-api/re02.html – user694733

+0

Können Sie mit diesem "Drittanbieter" Treibercode verknüpfen? Das '# ifdef', das du zeigst, sollte nicht mehr da sein. –

Antwort

6

Im Linux-Kernel können die meisten Treiber entweder statisch (integriert) mit dem Kernel-Image selbst verbunden sein oder als dynamisch geladene Module (.ko Dateien) erstellt werden.

Das Makro MODULE ist für eine C-Datei definiert, wenn es als Teil eines Moduls kompiliert wird, und nicht definiert, wenn es direkt in den Kernel integriert wird.

Der Code, den Sie zeigen, definiert nur os_driver_cleanup als Modul-Exit-Funktion, wenn es als ein Modul kompiliert wird. Dieses Konstrukt ist jedoch im modernen Kernel-Code nicht notwendig; include/linux/init.h definiert module_exit() als ein Makro, dessen Implementierung von #ifdef MODULE abhängt.

Grundsätzlich sollten Sie immer eine Exit-Funktion bereitstellen und die #ifdef um lassen. Sie sollten auch Ihre Exit-Funktion mit __exit markieren, die die Aufnahme des Codes für Ihren im modularen/nicht-modularen Fall richtig kontrolliert.

Hier ist ein Beispiel für den richtigen Init/Exit-Code.

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