Linux模块卸载
2016-03-09 12:07
489 查看
系统信息:内核为2.6.32, CentOSX86_64
卸载模块hook时,不管是否为强制卸载,都输出:
ERROR:Module targetis in use.
卸载失败原因分析
情况0:有其它模块依赖要卸载的模块。模块a是否依赖模块b,这个在模块a加载的时候调用resolve_symbol抉择,如果模块a的symbol在模块b中,则依赖
情况1:只有LIVE状态的模块才能被卸载。
情况2:引用计数在有其它模块或者内核本身引用的时候不为0,要卸载就要等待它们不引用为止。
情况3:这个情况比较普遍,因为模块万一在使用过程中oom或者依赖它的模块oom或者模块本身写的不好有bug从而破坏了一些数据结构,那么可能造成exit函数中阻塞,最终rmmod不返回!
模块状态
1. enum module_state
2.
{
3. MODULE_STATE_LIVE, //模块当前正常使用中(存活状态) 0
4.
MODULE_STATE_COMING, //模块当前正在被加载 1
5. MODULE_STATE_GOING, //模块当前正在被卸载 2
6.
};
示例程序如下
=== Makefile 内容 ===
ifneq ($(KERNELRELEASE),)
mymodules-objs:=rmmodule.c
obj-m += rmmodule.o
else
PWD := $(shell pwd)
KVER := $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
$(MAKE)-C $(KDIR) M=$(PWD)
clean:
rm-rf *.o *.mod.c *.ko *.symvers *.order *.markers
endif
参考资料:
【1】
强力卸载内核模块
/article/1499051.html
【2】 linux内核模块的强制删除
/article/8042628.html
【3】 Linux module
http://www.tuicool.com/articles/BfuU3m
【4】 Linux模块机制浅析
http://www.cnblogs.com/fanzhidongyzby/p/3730131.html
【5】 Linux内核模块的装载和卸载
http://blog.chinaunix.net/uid-23028407-id-264285.html
卸载模块hook时,不管是否为强制卸载,都输出:
ERROR:Module targetis in use.
卸载失败原因分析
情况0:有其它模块依赖要卸载的模块。模块a是否依赖模块b,这个在模块a加载的时候调用resolve_symbol抉择,如果模块a的symbol在模块b中,则依赖
情况1:只有LIVE状态的模块才能被卸载。
情况2:引用计数在有其它模块或者内核本身引用的时候不为0,要卸载就要等待它们不引用为止。
情况3:这个情况比较普遍,因为模块万一在使用过程中oom或者依赖它的模块oom或者模块本身写的不好有bug从而破坏了一些数据结构,那么可能造成exit函数中阻塞,最终rmmod不返回!
模块状态
1. enum module_state
2.
{
3. MODULE_STATE_LIVE, //模块当前正常使用中(存活状态) 0
4.
MODULE_STATE_COMING, //模块当前正在被加载 1
5. MODULE_STATE_GOING, //模块当前正在被卸载 2
6.
};
示例程序如下
#include<linux/init.h> #include <linux/module.h> #include<linux/kernel.h> #include<linux/list.h> #include<linux/cpumask.h> static int __init rm_init(void) { struct module *mod = NULL, *relate = NULL; int cpu = 0; //print this module's name and module's state printk(KERN_ALERT"[insmod mymod] name:%s state:%d\n",THIS_MODULE->name,THIS_MODULE->state); // list module , find hook module list_for_each_entry(mod,THIS_MODULE->list.prev,list) { if(strcmp(mod->name,"hook")==0) { //print hook's module's name module's state count printk(KERN_ALERT"name:%s state:%d refcnt:%u \n",mod->name,mod->state,module_refcount(mod)); //print all depend module's name if(!list_empty(&mod->modules_which_use_me)) { list_for_each_entry(relate,&mod->modules_which_use_me,modules_which_use_me) { printk(KERN_ALERT"%s \n",relate->name); } } else { printk(KERN_ALERT"used by NULL\n"); } mod->state = 0; //set hook's count is 0 for_each_possible_cpu(cpu) { local_set(__module_ref_addr(mod,cpu),0); } //print hook's module's name module's state count again printk(KERN_ALERT"name:%s state:%d refcnt:%u\n",mod->name,mod->state,module_refcount(mod)); } } return 0; } void __exit rm_exit(void) { printk(KERN_ALERT"[rmmod mymod] name:%s state:%d\n",THIS_MODULE->name,THIS_MODULE->state); } MODULE_AUTHOR("zhao liang. Halcrow <mhalcrow@us.ibm.com>"); MODULE_DESCRIPTION("hook hide process"); MODULE_LICENSE("GPL"); module_init(rm_init) module_exit(rm_exit)
=== Makefile 内容 ===
ifneq ($(KERNELRELEASE),)
mymodules-objs:=rmmodule.c
obj-m += rmmodule.o
else
PWD := $(shell pwd)
KVER := $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
$(MAKE)-C $(KDIR) M=$(PWD)
clean:
rm-rf *.o *.mod.c *.ko *.symvers *.order *.markers
endif
参考资料:
【1】
强力卸载内核模块
/article/1499051.html
【2】 linux内核模块的强制删除
/article/8042628.html
【3】 Linux module
http://www.tuicool.com/articles/BfuU3m
【4】 Linux模块机制浅析
http://www.cnblogs.com/fanzhidongyzby/p/3730131.html
【5】 Linux内核模块的装载和卸载
http://blog.chinaunix.net/uid-23028407-id-264285.html
相关文章推荐
- Linux chmod命令修改文件与文件夹权限命令代码
- Linux crontab 计划命令
- centos 关闭防火墙
- Linux内核分析(第三周)
- Linux 查找文件方法
- linux 添加新硬盘
- Linux安装ElasticSearch-2.2.0-分词器插件(IK)
- linux 链接ln的使用 创建和删除符号连接(软、硬链接)
- linux命令行参数解析学习心得
- Gnu/Linux系统C编程之 -- 用户和组
- linux用户登陆显示:could not open session .
- Linux与JVM的内存关系分析
- Linux-centos7防火墙问题
- Linux学习笔记:1.2 权限管理命令chmod
- Linux下ssh免密码登录配置(20160309)
- SELinux and LD_PRELOAD
- CentOS 查看IP,端口 修改IP,打开端口生效
- linux分享五:日志系统
- linux分享四:cron系统
- Linux环境编程