5

Cosa succede se gli attributi __init & __exit vengono utilizzati nei moduli di intializzazione e uscita & cosa succede se non li uso. Esempio come mostrato di seguito.Utilizzo degli attributi __init e __exit

utilizzando attributi

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

Witout attribuisce

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

risposta

3

@Sandy, La macro __init causa la funzione init da scartare e la sua memoria (vmalloc) liberata una volta la funzione init finiture per i driver integrati. La macro __exit causa l'omissione della funzione quando il modulo è incorporato nel kernel. Sia __init che __exit non valgono per il LKM. Anche passare attraverso questi collegamenti What does __init mean in the Linux kernel code? http://amar-techbits.blogspot.in/2012/08/understanding-macro-init-and-exit-in.html

+0

'__init' e (in misura minore estensione) '__exit' sono utili anche per i moduli del kernel caricabili, non solo per quelli built-in. Il loro effetto è identico a quello che hai descritto, eccetto che '__exit' ordina di omettere la funzione contrassegnata da esso se lo scaricamento del modulo è disabilitato, IIRC. – Eugene

+0

@Eugene, hmm vero e grazie per avermi corretto :-) –

3

La differenza principale è la liberazione della memoria.

Il __init token in esso è un accenno al kernel che la proposta function is used only at initialization time. Il modulo loader drops the initialization function after the module is loaded, making its memory available for other uses. C'è un tag simile (__initdata) per i dati utilizzati soltanto durante l'inizializzazione. L'uso di __init e __initdata è facoltativo, ma ne vale la pena. Assicuratevi di non usarli per qualsiasi funzione (o struttura dati) che userete dopo il completamento dell'inizializzazione.

uso del __init family of macros to place one-time initialization routines into a common section in the object file. Suo cugino __initdata, utilizzato per contrassegnare gli elementi di dati monouso. Le funzioni e i dati contrassegnati come inizializzazione utilizzando queste macro vengono raccolti in una sezione ELF appositamente denominata.

Successivamente, dopo che sono state utilizzate queste funzioni di inizializzazione di una volta e oggetti di dati, il kernel frees the memory occupied by these items. Potreste aver visto il messaggio del kernel familiare sopra il parte finale del boot process saying, "Freeing init memory: 296K." .

Lo scopo di porre questa funzione in una sezione speciale del file oggetto è così il memory space that it occupies can be reclaimed when it is no longer needed.

+0

Questo intero messaggio dovrebbe essere una citazione? Se sì, da dove? –