如果__init & __exit屬性用於初始化和退出模塊&如果我不使用它們會發生什麼情況。示例如下所示。__init和__exit屬性的用法
使用屬性
static __init int myinit(void)
{}
static __exit void myexit(void)
{}
不用其他屬性
static int myinit(void)
{}
static void myexit(void)
{}
如果__init & __exit屬性用於初始化和退出模塊&如果我不使用它們會發生什麼情況。示例如下所示。__init和__exit屬性的用法
使用屬性
static __init int myinit(void)
{}
static __exit void myexit(void)
{}
不用其他屬性
static int myinit(void)
{}
static void myexit(void)
{}
@Sandy所述的__init宏導致init函數即被丟棄,並且它的存儲器(vmalloc的)釋放一次init函數完成內置驅動程序。當模塊內置到內核中時,__exit宏會導致函數被忽略。 __init和__exit都不適合LKM。也請通過這些鏈接 What does __init mean in the Linux kernel code? http://amar-techbits.blogspot.in/2012/08/understanding-macro-init-and-exit-in.html
主要的區別是釋放內存。
在它的__init token
是一個提示給定function is used only at initialization time.
模塊加載drops the initialization function after the module is loaded, making its memory available for other uses.
有僅用於初始化期間使用的數據的相似標籤(__initdata)內核。 __init和__initdata的使用是可選的,但它是值得的麻煩。在初始化完成後,請確保不要將它們用於您將要使用的任何函數(或數據結構) 。
使用__init family of macros to place one-time initialization routines into a common section in the object file.
其表弟 __initdata,用於標記一次性使用的數據項。使用這些宏標記爲初始化的函數和 被收集到一個專門命名的ELF節中。
後來,在使用了這些一次性初始化函數和數據對象後,kernel frees the memory occupied by these items
。你可能已經看到了熟悉的內核消息附近的boot process saying, "Freeing init memory: 296K." .
將 這個功能到目標文件的特殊部分的目的最終 部分是爲了讓memory space that it occupies can be reclaimed when it is no longer needed.
這整個消息應該是一個報價?如果是這樣,從哪裏? –
'__init'和(在較小範圍)'__exit'對於可加載的內核模塊也很有用,不僅適用於內置模塊。它們的作用與您所描述的相同,除了'__exit'指示在模塊卸載禁用時省略標記爲它的功能,IIRC。 – Eugene
@Eugene,嗯真的,並感謝糾正我:-) –