解决调试阶段挂载模块不能卸载的问题

我目前在开发一个块设备驱动时遇到了可能大家都会遇到的问题,那就是挂载模块时,产生了异常,当然由于是调试阶段不可

避免的么,不是本人水平问题,使用lsmod看到发现该模块已经出现在列表里了,如果运气好的好used by后面的引用计数还是0,你可以

通过rmmod卸载它,但我运气不好引用计数是1...,这样rmmod可是不能起作用了,所以only的办法就是重启..然后开始不停的挂载和重

启的循环,很浪费时间...,所以想了想怎么样才能有办法,手动的减少引用计数呢?这样我就可以用rmmod卸载它了...
 OK,闲话少说,当然是在你的模块内部增加个方法让其响应外部的指令来降低自身的引用计数,由于你的模块是挂载到内核上

的,怎样才能用最简单的方法来实现用户态程序和内核态通讯呢?不用去思考什么共享内存呀,Socket通讯啦,太麻烦..请用IOCTL,一条

指令搞定:
 Fox example:
        请先定义个
 #define IOCHARDRESET 0x111 //这个就是我们自定义的指令
 然后,无论你是块设备还是字符设备都会定义类似下面的结构体吧,加上一句话吧
 struct block_device_operations blkdev_fops =
 {
  .owner = THIS_MODULE,
  .ioctl =  blkdev_ioctl,
 };
 最后实现这个函数,这里说明一下我的内核为2.6所以用的内核引用计数为module_put和try_module_get,2.4请自己寻找方法

 int simp_blkdev_ioctl(struct inode *inode, struct file *filp,
                 unsigned int cmd, unsigned long arg)
 {
  switch (cmd)
  {
  case IOCHARDRESET:
   //while(MOD_IN_USE)
   //引用计数减一
   module_put(THIS_MODULE);
 }

  //MOD_DEC_USE_COUNT;
  //MOD_INC_USE_COUNT;
 }
最后测试代码:
//All right revsered by yoki2009
//mailto:imj040144@tom.com
//Welcome to my blog:    http://blog.csdn.net/yoki2009

#include <stdio.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

#define IOCHARDRESET 0x111
int main(int argc, char *argv[])
{
 printf("Hello, world/n");
 int dev =  open("/dev/blockdev", O_WRONLY);
 ioctl(dev,IOCHARDRESET,0);
 close(dev);
 return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值