肝便化作两次胃镜手术:模块rmmod/insmod
来源:百度文库 编辑:偶看新闻 时间:2024/05/03 08:56:03
如果我们在模块的初始化函数和清除函数中有打印信息的话,可能会在控制台上显示出来,或者通过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 字段是一个权限值; 你应当使用