Główna różnica polega na zwolnieniu pamięci.
__init token
w nim to aluzja do jądra, że dany function is used only at initialization time.
Ładowarka moduł drops the initialization function after the module is loaded, making its memory available for other uses.
istnieje podobny tag (__initdata) dla danych wykorzystywanych wyłącznie podczas inicjalizacji. Użycie __init i __initdata jest opcjonalne, ale warto się z tym zmierzyć. Tylko pamiętaj, aby nie używać ich do dowolnej funkcji (lub struktury danych), której będziesz używać po zakończeniu inicjalizacji.
korzystanie z __init family of macros to place one-time initialization routines into a common section in the object file.
Jego kuzyn __initdata, używany do oznaczania elementów danych jednorazowego użytku. Funkcje oznaczone jako inicjujące za pomocą tych makr są gromadzone w specjalnie nazwanej sekcji ELF.
Później, po użyciu tych jednorazowych funkcji inicjowania i obiektów danych, kernel frees the memory occupied by these items
. Może widzieliście komunikat jądra znajomy blisko końcowego część boot process saying, "Freeing init memory: 296K." .
celów wprowadzania tę funkcję w specjalnej sekcji pliku obiektu jest więc `__init` memory space that it occupies can be reclaimed when it is no longer needed.
i (w mniejszym extent) '__exit' są przydatne także dla ładowalnych modułów jądra, nie tylko dla wbudowanych. Ich efekt jest taki sam, jak opisałeś, z tym wyjątkiem, że '__exit' nakazuje pominąć funkcję oznaczoną, jeśli wyładowanie modułu jest wyłączone, IIRC. – Eugene
@Eugene, hmm prawda i dzięki za poprawienie mnie :-) –