2014-10-01 9 views
6

Obecnie przeglądam kod sterownika "innej firmy", aby dowiedzieć się, jak działa. Spojrzałem na witryny takie jak this one, więc trochę rozumiem, jak działa podstawowa przesłanka, ale nie rozumiem celu tutaj #ifdef MODULE. Google nie stanowi zbytniej pomocy, ale myślę, że definicja odnosi się do modułu jądra? (Jestem również całkowicie nowy na tym.)Cel "#ifdef MODUŁA" wokół module_exit()?

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

Moje pytanie brzmi, co się stanie, jeśli usunę oświadczenie #ifdef? Ponadto, dlaczego/kiedy konieczne byłoby dołączenie oświadczenia #ifdef?

+1

Czy istnieje alternatywa (niżej w kodzie) 'module_exit (...)' linia? Możliwe, że wywoływane są funkcje alternatywne, a moduł 'ifdef MODULE' steruje tym – chrisb2244

+0

. Może' MODULE' ma zostać zdefiniowany, gdy sterownik jest statycznie wkompilowany w jądro? http://www.fsl.cs.sunysb.edu/kernel-api/re02.html – user694733

+0

Czy można utworzyć link do tego kodu "strony trzeciej"? Pokazane "# ifdef" nie powinno już tam być. –

Odpowiedz

6

W jądrze Linuxa większość sterowników może być statycznie połączona (wbudowana) z samym obrazem jądra lub zbudowana jako dynamicznie ładowane moduły (pliki .ko).

Makro MODULE jest zdefiniowane dla pliku C podczas kompilacji jako część modułu i niezdefiniowane, gdy jest budowane bezpośrednio w jądrze.

Wyświetlany kod definiuje tylko os_driver_cleanup jako funkcję wyjścia modułu podczas kompilacji jako moduł. Jednak konstrukcja ta nie jest potrzebna we współczesnym kodzie jądra; include/linux/init.h definiuje module_exit() jako makro, którego implementacja zależy od #ifdef MODULE.

Zasadniczo należy zawsze podać funkcję wyjścia i pozostawić wartość #ifdef około module_exit(). Powinieneś również oznaczyć swoją funkcję wyjścia przy pomocy __exit, która odpowiednio kontroluje włączenie kodu do twojego w modułowej/niemodułowej obudowie.

Oto przykład prawidłowego kodu init/exit.

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