5

Co się stanie, jeśli atrybuty __init &_exit są używane w modułach intializacji i wyjściu &, co się stanie, jeśli ich nie użyję. Przykład pokazany poniżej.Użycie atrybutów __init & __exit

pomocą atrybutów

static __init int myinit(void) 
{} 
static __exit void myexit(void) 
{} 

Witout atrybutów

static int myinit(void) 
{} 
static void myexit(void) 
{} 

Odpowiedz

3

@Sandy The __init makro powoduje, że funkcja init zostać usunięte, a pamięć (vmalloc) uwalnia się po funkcji init wykończenia dla wbudowanych sterowników. Makro __exit powoduje pominięcie tej funkcji, gdy moduł jest wbudowany w jądro. Zarówno __init, jak i _exexit nie będą dobre dla LKM. Przejrzyj także te łącza: What does __init mean in the Linux kernel code? http://amar-techbits.blogspot.in/2012/08/understanding-macro-init-and-exit-in.html

+0

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

+0

@Eugene, hmm prawda i dzięki za poprawienie mnie :-) –

3

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.

+0

Czy ta cała wiadomość ma być cytatem? Jeśli tak, skąd? –