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")))
和