Linux模块卸载

系统信息:内核为2.6.32 CentOSX86_64

 

卸载模块hook时,不管是否为强制卸载,都输出:

ERRORModule 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】 强力卸载内核模块

http://blog.csdn.net/zhangskd/article/details/7945140

【2】    linux内核模块的强制删除

 http://blog.csdn.net/newnewman80/article/details/7548978

【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



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值