Operating system __init&__退出属性

Operating system __init&__退出属性,operating-system,linux-device-driver,kernel-module,kernel,Operating System,Linux Device Driver,Kernel Module,Kernel,如果初始化和退出模块中使用了_init和_exit属性,会发生什么?如果我不使用它们,会发生什么。示例如下所示 使用属性 static __init int myinit(void) {} static __exit void myexit(void) {} static int myinit(void) {} static void myexit(void) {} 不带属性 static __init int myinit(void) {} static __exit void myexi

如果初始化和退出模块中使用了_init和_exit属性,会发生什么?如果我不使用它们,会发生什么。示例如下所示

使用属性

static __init int myinit(void)
{}
static __exit void myexit(void)
{}
static int myinit(void)
{}
static void myexit(void)
{}
不带属性

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

@Sandy,对于内置驱动程序,_init宏会在init函数完成后丢弃init函数并释放其内存(vmalloc)。当模块内置到内核中时,_exit宏会导致函数的省略。初始和退出对LKM都不起作用。也要浏览这些链接
主要区别在于释放内存

中的
\uuuu init token
提示内核,给定的
函数仅在初始化时使用。
模块加载程序
在加载模块后丢弃初始化函数,使其内存可用于其他用途。
对于仅在初始化期间使用的数据,有一个类似的标记(_initdata)。使用_init和_initdata是可选的,但值得一试。只是要确保不要将它们用于其他用途 初始化完成后将使用的任何函数(或数据结构)

使用
\uuu init系列
宏将一次性初始化例程放入对象文件的公共部分。
__initdata,用于标记一次性使用数据项。功能及 使用这些宏标记为初始化的数据被收集到一个特别命名的ELF节中

之后,在使用这些一次性初始化函数和数据对象之后,
内核将释放
这些项目占用的内存
。您可能已经在期末考试附近看到了熟悉的内核消息 启动过程的一部分,即“释放init内存:296K”。

放置的目的 将此函数放入对象文件的一个特殊部分,这样它所占用的
内存空间就可以

当不再需要时回收。

这整条消息应该是一个报价吗?如果是这样,从何处开始?
\uuuu init
和(在较小程度上)
\uuu exit
对于可加载内核模块也很有用,而不仅仅是对于内置模块。它们的效果与您描述的相同,只是
\u exit
指示在禁用模块卸载时忽略标记有它的功能,IIRC。