分类: 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也不会再有已经卸载的模块的信息,这样再次加载模块也不会出错了!
|
chinaunix网友2010-12-13 15:24:33
很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com