Linux学习笔记
1. __init
int __init loongson_acpi_init(void)
{
...
acpi_registers_setup();
acpi_hw_clear_status();
return 0;
}
__init有什么作用?
__init定义在:include/linux/init.h
#define __init __attribute__ ((__section__ (".init.text")))
#define __initdata __attribute__ ((__section__ (".init.data")))
It tells the compiler to put the variable or the function in a special section, which is declared in vmlinux.lds. init puts the function in the “.init.text” section and initdata puts the data in the “.init.data” section.
译文:
__init宏告知编译器,将变量或函数放在一个特殊的区域,这个区域定义在vmlinux.lds中。__init将函数放在".init.text"这个代码区中,__initdata将数据放在".init.data"这个数据区中。
所以:
标记为初始化的函数,表明该函数供在初始化期间使用。在模块装载之后,模块装载就会将初始化函数扔掉。这样可以将该函数占用的内存释放出来。
常用的宏:
- __init,标记内核启动时所用的初始化代码,内核启动完成后就不再使用。其所修饰的内容被放到.init.text section中。
- __exit,标记模块退出代码,对非模块无效
- __initdata,标记内核启动时所用的初始化数据结构,内核启动完成后不再使用。其所修饰的内容被放到.init.data section中。
- __devinit,标记设备初始化所用的代码
- __devinitdata,标记设备初始化所用的数据结构
- __devexit,标记设备移除时所用的代码
- xxx_initcall,7个级别的初始化函数