解决调试阶段挂载模块不能卸载的问题
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;
}
避免的么,不是本人水平问题,使用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;
}
相关文章推荐
- 解决安装完IE8后,VS2005不能调试问题.........
- 解决apple software update不能卸载的问题
- 解决win7/win8.1 驱动调试KdPrint不能输出的问题
- 解决xcode程序不能调试的问题
- 双系统下Linux(ubuntu)不能进入windows的NTFS分区之挂载错误问题解决
- MSNEncryptM.dll模块错误造成MSN不能启动的问题解决
- 分布式一致性解决分布式一致性问题用二阶段提交一个没有高可用组件的数据库不能依靠外部软件来实现高可用
- 解决ThinkPHP中开启调试模式无法加载模块的问题。
- 解决在vc调试代码结束时候,不能把控制台黑屏目退出的问题
- 不能对存储过程进行单步调试的问题解决方法
- 彻底解决Ant在Tomcat进行卸载部署undeploy时不能删除jar文件的问题
- 【C++&&OpenCV】解决cvLoadImage等函数不能进行单步调试的OpenCV配置问题
- 解决使用微软模拟器VS Emulator for Android在VS2017 Xamarin开发中不能调试程序的问题。
- 解决IE8在vs2005下不能调试的问题.
- 解决eclipse 不能调试 j2me程序的问题
- 解决在vc调试代码结束时候,不能把控制台黑屏目退出的问题
- IOS真机调试:swift工程不能在ios8真机上运行问题解决
- 不能对存储过程进行单步调试的问题解决方法
- 解决android应用程序不能调试的问题
- NFS服务器不能挂载问题终极解决办法