当前位置:嗨网首页>书籍在线阅读

05-模块卸载函数

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

4.4 模块卸载函数

Linux内核模块加载函数一般以_ _exit标识声明,典型的模块卸载函数的形式如代码清单4.3所示。

代码清单4.3 内核模块卸载函数

1 static void _ _exit cleanup_function(void)

2 {

3 / 释放代码 /

4 }

5 module_exit(cleanup_function);

模块卸载函数在模块卸载的时候执行,不返回任何值,必须以“module_exit(函数名)”的形式来指定。

通常来说,模块卸载函数要完成与模块加载函数相反的功能,如下所示。

● 若模块加载函数注册了XXX,则模块卸载函数应该注销XXX。

● 若模块加载函数动态申请了内存,则模块卸载函数应释放该内存。

● 若模块加载函数申请了硬件资源(中断、DMA通道、I/O端口和I/O内存等)的占用,则模块卸载函数应释放这些硬件资源。

● 若模块加载函数开启了硬件,则卸载函数中一般要关闭之。

和_ init一样, exit也可以使对应函数在运行完成后自动回收内存。实际上, init和 _exit都是宏,其定义分别为:

define _ init attribute (( section _ (".init.text")))

ifdef MODULE

define _ exit attribute (( section _(".exit.text")))

else

define _ exit _attributeused attribute (( section _(".exit.text")))

endif

数据也可以被定义为_ initdata和 _exitdata,这两个宏分别为:

define _ initdata attribute (( section _ (".init.data")))

define _ exitdata attribute (( section _(".exit.data")))