您的位置:首页 > 其它

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

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

避免的么,不是本人水平问题,使用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: