问题提出
在驱动程序模块的编写中,常常会在初始化函数的第一行中加上关键字“__init”,请问“__init”是什么意思?
比如下面的代码:
static int __init led_init(void) {
// 初始化代码:注册设备、分配资源等
return 0;
}
module_init(led_init);
详细解释
__init
的作用
在 Linux 内核代码中,__init
是一个宏,用于标记初始化函数的代码段。这是一种内核的优化方式,旨在减少内核的内存占用。
__init
的功能
-
标记初始化代码:
- 内核会将带有
__init
标记的代码放入一个特殊的内存区(.init.text
段)。 - 这段内存在初始化完成后(通常是模块加载完成或内核启动完成后)会被释放,节省内存。
- 内核会将带有
-
仅在初始化时执行:
- 这些代码通常只需要在模块加载或系统启动时运行一次。
- 运行结束后,它们不会再被调用。
使用 __init
的场景
-
模块初始化函数:
- 像例子中的
led_init
,是模块加载时的入口函数,只需要运行一次,因此使用__init
标记。 - 例如:
static int __init led_init(void) { // 初始化代码 return
- 像例子中的