曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4863|回复: 0
打印 上一主题 下一主题

模块初始化函数和删除函数

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2009-8-13 18:00:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
模块初始化函数也称为模块加载函数。模块初始化函数的定义一般形如:
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 。一般来说,卸载函数和加载函数有着相反的功能:
      若模块加载函数注册了 XXX,则模块卸载函数应该注销 XXX。
      如模块加载函数动态申请了内存,则模块卸载函数应释放内存。
      如模块加载函数申请了硬件资源(中断、DMA通道、I/O端口和 I/O内存等)的占用,则模块卸载函数应释放这些硬件资源。
      若模块卸载函数应该释放这些硬件资源。
      若模块加载函数开启了硬件,则卸载函数中一般要关闭硬件。
和 __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)))
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-4 03:26 , Processed in 0.060589 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表