5

Was passiert, wenn __init & __Exit-Attribute in Initialisierungs- und Exit-Modulen verwendet werden & was passiert, wenn ich sie nicht verwende? Beispiel wie unten gezeigt.Verwendung von __init & __exit-Attributen

Verwendung Attributes

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

Witout Attribute

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

Antwort

3

@Sandy, The __init Makro bewirkt, dass die init-Funktion, sobald die Funktion init verworfen und sein Speicher (vmalloc) befreit werden endet für integrierte Treiber. Das __exit-Makro bewirkt das Auslassen der Funktion, wenn das Modul in den Kernel eingebaut ist. Sowohl __init als auch __exit werden für das LKM nicht gut sein. Gehen Sie auch über diese Links 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' und (in geringerem extent) '__exit' sind auch für die ladbaren Kernel-Module nützlich, nicht nur für die eingebauten. Ihre Wirkung ist die gleiche wie sie beschrieben wurde, außer dass "__exit" anweist, die damit markierte Funktion wegzulassen, wenn das Modul entladen ist, IIRC. – Eugene

+0

@Eugene, hmm true und danke für die Korrektur :-) –

3

Der wesentliche Unterschied des Speichers zu befreien.

Die __init token in der es ist ein Hinweis auf den Kernel, dass die gegebenen function is used only at initialization time. Die Modullader drops the initialization function after the module is loaded, making its memory available for other uses. es einen ähnlicher Tag ist (__initdata) nur für Daten, die während der Initialisierung verwendet. Die Verwendung von __init und __initdata ist optional, aber es lohnt sich. Achten Sie darauf, sie nicht für irgendeine Funktion (oder Datenstruktur) zu verwenden, die Sie nach Abschluss der Initialisierung verwenden werden.

Verwendung der __init family of macros to place one-time initialization routines into a common section in the object file. Ihr Cousin __initdata, verwendet, um einmalige Datenelemente zu markieren. Funktionen und Daten, die mit diesen Makros als Initialisierung markiert sind, werden in einem speziell benannten ELF-Abschnitt gesammelt.

Später, nachdem diese einmaligen Initialisierungsfunktionen und Datenobjekte verwendet wurden, die kernel frees the memory occupied by these items. Sie haben vielleicht die bekannte Kernel-Nachricht in der Nähe des letzten Teil der boot process saying, "Freeing init memory: 296K." .

Der Zweck des Vergebens diese Funktion in einen speziellen Abschnitt der Objektdatei zu sehen ist, so dass die memory space that it occupies can be reclaimed when it is no longer needed.

+0

Soll diese ganze Nachricht ein Zitat sein? Wenn ja, von wo? –