今天看到 Linux 驱动程序,对一些基本的概念不了解。
static int __init func(void)
这是 Linux 模块入口函数,__init 是在内核模块函数用的,指定该函数为模块入口函数,即模块运行时从这里开始。在模块编译时,func 函数名会存在一张叫 init 的初始化表中,这样可以方便内核启动时快速加载。
static int __exit func(void)
原理同__init,是模块退出函数。
更深入地说,__init 和 __exit 是 linux 内核编程的一个特殊宏,展开是一个 gcc 的扩展属性语法,限制了函数连接时放 elf 文件的那个 section。定义大概如下(不同内核版本可能有差异):
#define __init __attribute__((__section__(".init")))
通过把 init 函数限制在一个固定的 section,一个作用是在启动时简单遍历 section 调用初始化函数即可,另外一个作用是在初始化完成后,可以马上释放该 section 所占空间给系统用(因为初始化函数通常只在系统启动后执行一次)。