5

如果__init & __exit属性用于初始化和退出模块&如果我不使用它们会发生什么情况。示例如下所示。__init和__exit属性的用法

使用属性

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

不用其他属性

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

回答

3

@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

+0

'__init'和(在较小范围)'__exit'对于可加载的内核模块也很有用,不仅适用于内置模块。它们的作用与您所描述的相同,除了'__exit'指示在模块卸载禁用时省略标记为它的功能,IIRC。 – Eugene

+0

@Eugene,嗯真的,并感谢纠正我:-) –

3

主要的区别是释放内存。

在它的__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.

+0

这整个消息应该是一个报价?如果是这样,从哪里? –