6

如果在初始化和退出模块中使用 __init 和 __exit 属性会发生什么,如果我不使用它们会发生什么。示例如下图所示。

使用属性

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

无属性

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

2 回答 2

5

@Sandy,一旦内置驱动程序的 init 函数完成, __init 宏会导致 init 函数被丢弃并释放其内存(vmalloc)。__exit 宏会在模块内置到内核时导致函数的省略。__init 和 __exit 都不适合 LKM。还要通过这些链接 __init 在 Linux 内核代码中是什么意思? http://amar-techbits.blogspot.in/2012/08/understanding-macro-init-and-exit-in.html

于 2013-10-06T16:48:30.790 回答
4

主要区别在于释放内存。

__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.

于 2013-10-07T06:10:52.543 回答