Chinaunix首页 | 论坛 | 博客
  • 博客访问: 539561
  • 博文数量: 83
  • 博客积分: 4136
  • 博客等级: 中校
  • 技术积分: 886
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-19 21:14
文章分类

全部博文(83)

文章存档

2013年(1)

2011年(25)

2010年(57)

分类: LINUX

2010-12-12 11:29:33

在 编写驱动程序的时候有时候会出现这种情况,模块加载之后不能卸载或卸载之后不能在加载,cat /proc/devices 后发现设备还占用着设备号,这种情况下,再次加载驱动模块肯定不会成功,必须重新启动才可以解决。最近仔细看书后发现自己在驱动程序的卸载函数中少写了两 个函数调用,以至于在加载模块的时候申请或添加的设备没有被释放或删除。

解决方案:

第一步、在/lib/modules/目录中建立与当前内核版本号一致的目录 如 uname -r 得到 2.6.31.6则mkdir -p /lib/modules/2.6.31.6 否则会出现“rmmod: chdir(2.6.31.6): No such file or directory”类似的错误,而模块也没有被卸载;

第二步、在驱动模块卸载函数__exit中的cdev_del(struct cdev *)函数调用后即注销字符设备后调用 unregister_chrdev_region(dev_t devno,  unsigned count)函数释放在驱动加载函数__init中通过register_chrdev_region、alloc_chrdev_region,注册的 主设备号。(cdev_del函数、unregister_chrdev_region函数缺一不可);

经过以上两步操作后,rmmod 模块名称 卸载模块就不会错误了,而且cat /proc/devices也不会再有已经卸载的模块的信息,这样再次加载模块也不会出错了!

这个问题,我也遇到过,那要看人的模块名,和设备名是不是一样, 要是一样的话,就直接rmmod *.ko 如果不是一样的话,就得,rmmod  设备名.ko,主要是在模块名,和设备名,这二者之间。

至于mini2440开发板,是需要建立/lib/modules/2.6.29.4-FriendlyARM
但是还得看你的内核的版本,所以2.6.29.4不一定和你的一样,你需要

#uname -r

查看一下你的内核版本,替换掉才行。
阅读(815) | 评论(1) | 转发(0) |
0

上一篇:mini2440使用uboot

下一篇:Linux tree命令

给主人留下些什么吧!~~

chinaunix网友2010-12-13 15:24:33

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com