浙能集团下属子公司:模块rmmod/insmod

来源:百度文库 编辑:中财网 时间:2024/04/29 10:04:32
 #rmmod hello     #注意这里不需要ko,而且可在任何目录下操作,2.6支持带有ko

   如果我们在模块的初始化函数和清除函数中有打印信息的话,可能会在控制台上显示出来,或者通过dmesg可以查看到自开机以来所有的缓冲的打印信息。

   那么在insmod和rmmod的时候到底发生了什么呢?

   这里实际上包含两个重要的过程,我们知道内核模块是kernel object,也就是说它仅仅是目标代码,没有经过链接。所以在insmod的第一个过程是解析内核模块外部符号。这类似于一个链接的过程,如果有不能解析的符号,就会报unsolved symbol,此时模块加载会失败。

   外部符号被正确的解析后,就开始加载内核模块,就会调用在module_init()中声明的初始化函数,只有当初始化函数返回非负值,模块才能正确的被加载。

   对于rmmod也有两个过程, 首先检查是否有模块依赖于此模块,也就是说只有当lsmod查看到此模块used一栏的值为0时,模块才能被安全的卸载。卸载的时候调用module_exit()中声明的清除函数,释放占有的资源。

 

EXPORT_SYMBOL(print_hello);         //导出符号到内核符号表中

EXPORT_SYMBOL():

EXPORT_SYMBOL_GPL():

他们的区别在于:前一宏定义的任一个使得给定的符号在模块外可用. _GPL 版本的宏定义只能使符号对 GPL 许可的模块可用.

这个需要导出的变量存储于模块的一个特殊的可执行部分( "ELF 段")。//暂时记录一下,还没有深究

module_param(name,type,perm

module_param_array(name,type,num,perm);

module_param 字段是一个权限值; 你应当使用 中定义的值. 这个值控制谁可以存取这些模块参数在 sysfs 中的表示. 如果 perm 被设为 0, 就根本没有 sysfs 项. 否则, 它出现在 /sys/module[5] 下面, 带有给定的权限. 使用 S_IRUGO 作为参数可以被所有人读取, 但是不能改变; S_IRUGO|S_IWUSR 允许 root 来改变参数. 注意, 如果一个参数被 sysfs 修改, 你的模块看到的参数值也改变了, 但是你的模块没有任何其他的通知. 你应当不要使模块参数可写, 除非你准备好检测这个改变并且因而作出反应.