如果在初始化和退出模块中使用 __init 和 __exit 属性会发生什么,如果我不使用它们会发生什么。示例如下图所示。
使用属性
static __init int myinit(void)
{}
static __exit void myexit(void)
{}
无属性
static int myinit(void)
{}
static void myexit(void)
{}
如果在初始化和退出模块中使用 __init 和 __exit 属性会发生什么,如果我不使用它们会发生什么。示例如下图所示。
使用属性
static __init int myinit(void)
{}
static __exit void myexit(void)
{}
无属性
static int myinit(void)
{}
static void myexit(void)
{}
@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
主要区别在于释放内存。
它__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.