rmmod 删除kernel module 失败

ljgreen090032 2017-07-01 12:37:04
最近在改写一个内核模块,但是当内核模块有bug的时候(e.g., 遇到段错误),那么之前insmod的module就会进入一种错误状态。 我通过lsmod看到模块的引用数是1,但是没有被其它模块引用。在这种情况下,用modprobe -r 去删除模块就会失败。从网上搜索了半天,也没有太好的解决办法,其中有位大神给出了一个办法,就是手动插入另外一个模块。核心idea就是将引用数减到0,状态置为LIVE,然后再用rmmod删除。我是基于kernel 3.13,改动的libore.ko 和exofs.ko模块。下边贴上我写的删除模块的代码,虽然能够将引用数减为0,但是使用rmmod删除时,整个系统就killed 崩溃了,哪位大神帮忙给看看!或者有没有更好的解决办法,谢谢!

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/list.h>

void force(void){

}
int init_frmmod_module(void)
{

struct module *mod;
struct list_head *p = NULL, *tmp = NULL;
int cpu;
mod = find_module("exofs");
printk("init_frmmod_module\n");
mod->state=MODULE_STATE_LIVE;
printk("state = %u\n",mod->state);
mod->exit = force;
if(!mod->exit)
printk("error mod exit\n");
for_each_possible_cpu(cpu){
printk("cpu = %d,per_cpu_ptr(mod->refptr,cpu)->decs = %lu\n",cpu,per_cpu_ptr(mod->refptr,cpu)->decs);
while(per_cpu_ptr(mod->refptr,cpu)->decs > 0){
__this_cpu_dec(mod->refptr->decs);
}
}
smp_rmb();
for_each_possible_cpu(cpu){
printk("cpu = %d,per_cpu_ptr(mod->refptr,cpu)->incs = %lu\n",cpu,per_cpu_ptr(mod->refptr,cpu)->incs);
while(per_cpu_ptr(mod->refptr,cpu)->incs > 0){
__this_cpu_dec(mod->refptr->incs);
}
}
list_for_each_safe(p, tmp, &mod->source_list) {
list_del(p);
}

if(!list_empty(&mod->source_list))
printk("error list empty\n");
return 0;
}

void exit_frmmod_module(void)
{
printk("exit from the frmmod module\n");
}

MODULE_LICENSE("GPL");
module_init(init_frmmod_module);
module_exit(exit_frmmod_module);
...全文
651 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧