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.
fonte
2013-10-07 06:10:52
'__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
@Eugene, hmm vero e grazie per avermi corretto :-) –