曲径通幽论坛

标题: 模块初始化函数和删除函数 [打印本页]

作者: beyes    时间: 2009-8-13 18:00
标题: 模块初始化函数和删除函数
模块初始化函数也称为模块加载函数。模块初始化函数的定义一般形如:
static int __init initialization_function(void)
{
       /* 初始化代码 */
}
module_init(initialization_function);
模块初始化函数对模块提供的所有功能进行注册。在声明中,它应该被声明为 static 类型,因为它不想被特定之外的文件看到。

__init 看起来有点奇怪 ---- 这里,它提示内核此函数仅在初始化时被用到。模块加载器会在模块被装在后把这个初始化函数给丢弃,然后将其占用的内存空出另作他用。

module_init() 是一个宏,强制使用,它在模块的目标代码中增加一个特别的段 (section),以使模块初始化函数能被找到。

初始化成功返回 0 ,失败则返回错误编码。

删除函数(卸载函数)定义如
static void __exit cleanup_function(void)
{
       /* 清除代码 */
}
module_exit(cleanup_function);
模块卸载函数在模块卸载时执行;没有返回值,所以声明为 void 。一般来说,卸载函数和加载函数有着相反的功能:
和 __init 一样,__exit 也可以使函数在运行完成后自动回收内存。__init 和 __exit 都是宏,其定义分别是:
#define __init        __section(.init.text) __cold notrace  
#define __exit          __section(.exit.text) __exitused __cold    /* 两个定义在 include/linux/init.h 中可找到 */
对于__section() 的定义在 include/linux/compiler.h 中可找到:
#define __section(S) __attribute__ ((__section__(#S)))





欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2