欢迎来到天天文库
浏览记录
ID:9338825
大小:72.00 KB
页数:5页
时间:2018-04-28
《强力卸载内核模块(一)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、内核为2.6.32。卸载模块target时,不管是否为强制卸载,都输出:ERROR:Module targetisinuse.用lsmod查看target,发现Usedby计数为1,而据我所知,没有其它模块依赖target。编写模块检查target的module结构,发现:target->state==0//模块存活module_refcount(target)==1//模块引用计数为1list_empty(target->modules_which_use_me)==1//模块依赖列表为空这个就很奇怪,模块的引用计数为1,却没有引用者。这可能是模块插入内核时出错而引起的
2、,这里先不研究,先关注怎么把它强制卸载掉,虽然insmod加载是临时的,所以通过重启电脑可以解决一些问题,但是不能总是依靠重启啊。解决方法:编写模块mymod中把问题模块target的引用计数置为0,就可以顺利卸载掉target了! 代码 [java]viewplaincopy1.#include 2.#include 3.#include 4.#include 5.#include 6. 7.static
3、int __init mymod_init(void) 8.{ 9. struct module *mod,*relate; 1. int cpu; 2. 3. // 打印本模块的模块名和模块状态 4. printk(KERN_ALERT"[insmod mymod] name:%s state:%d",THIS_MODULE->name,THIS_MODULE->state); 5. 6. // 遍历模块列表,查找target模块 7. list_for_each_e
4、ntry(mod,THIS_MODULE->list.prev,list) 8. { 9. if(strcmp(mod->name,"target")==0) { 10. 11. // 打印target的模块名、模块状态、引用计数 12. printk(KERN_ALERT"name:%s state:%d refcnt:%u ",mod->name,mod->state,module_refcount(mod)); 13.
5、 14. // 打印出所有依赖target的模块名 15. if(!list_empty(&mod->modules_which_use_me)) { 16. list_for_each_entry(relate,&mod->modules_which_use_me,modules_which_use_me) 17. printk(K
6、ERN_ALERT"%s ",relate->name); 18. } else 19. printk(KERN_ALERT"used by NULL"); 20. 21. // 把target的引用计数置为0 22. for_each_possible_cpu(cpu) 23. local_set
7、(__module_ref_addr(mod,cpu),0); 24. 25. // 再看看target的名称、状态、引用计数 26. printk(KERN_ALERT"name:%s state:%d refcnt:%u",mod->name,mod->state,module_refcount(mod)); 1. } 2. } 3. return 0; 4
此文档下载收益归作者所有