免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3013 | 回复: 8
打印 上一主题 下一主题

写驱动时,有关删除模块的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-30 23:09 |只看该作者 |倒序浏览
今天我在实验驱动程序,奇怪的是,当我卸载驱动时,出现下面的提示,,怎么会多出第二行信息呢?不解:
# lsmod
button 2664 0 - Live 0xbf000000 (P)
# rmmod button   
Button delete successfully!                          //我自己打印的信息
rmmod: module 'button' not found              //这是怎么回事呢?
# lsmod
# insmod button.ko
insmod: cannot insert 'button.ko': Device or resource busy   //??

之后用lsmod 显示已经删除,可是再次添加模块的时候,出错了,添加不了:(
在此求高手解答:)

论坛徽章:
0
2 [报告]
发表于 2011-03-31 00:39 |只看该作者
先找个自带的LKM模块试试LSMOD, INSMOD, RMMOD. 如果没问题,就看你自己的DEVICE DRIVER的代码,特别是启动和卸载的地方

论坛徽章:
0
3 [报告]
发表于 2011-03-31 00:41 |只看该作者
你把代码贴出来嘛   一起分析分析

论坛徽章:
0
4 [报告]
发表于 2011-03-31 23:25 |只看该作者
本帖最后由 colorshape 于 2011-03-31 23:27 编辑

好的,把代码主要部分贴出来,没有贴出来的就是些头文件包含,多谢指教:)
  1. #define BUTTONDEVNAME   "button"
  2. #define BUTTONDEVNR                255
  3. struct button_struc {
  4.         int irq;
  5.         int pin;
  6.         int pin_setting;
  7.         char *name;
  8. };

  9. static int button_major = BUTTONDEVNR;
  10. struct cdev button_dev;
  11. static int keypressed = 0;
  12. static char *str = "param dev_id in request_irq()";
  13. static struct button_struc  button_info = {
  14.         .irq = IRQ_EINT8,
  15.         .pin = S3C2410_GPG0,
  16.         .pin_setting = S3C2410_GPG0_EINT8,
  17.         .name = "KEY0",
  18. };
  19. static volatile char keyval;
  20. static DECLARE_WAIT_QUEUE_HEAD(button_waitq);

  21. static irqreturn_t button_isr(int irq,void *dev_id)
  22. {
  23.         struct button_struc *button_info_l = (struct button_struc *)dev_id;

  24.         keyval = (!s3c2410_gpio_getpin(button_info_l->pin))+'0';
  25.         keypressed = 1;
  26.         wake_up_interruptible(&button_waitq);
  27.         return IRQ_RETVAL(IRQ_HANDLED);
  28. }

  29. static int button_open(struct inode *inode,struct file *file)
  30. {
  31.         int err;
  32.         err = request_irq(button_info.irq,button_isr,IRQ_TYPE_EDGE_BOTH,button_info.name,(void *)&button_info);
  33.         if(err) {
  34.                 disable_irq(button_info.irq);
  35.                 free_irq(button_info.irq,(void *)&button_info);
  36.         }
  37.         keypressed = 0;
  38.         return 0;
  39. }

  40. static int button_close(struct inode *inode,struct file *filp)
  41. {
  42.         free_irq(button_info.irq,(void *)&button_info);
  43.         return 0;
  44. }

  45. static int button_read(struct file *filp,char __user *buf,size_t cnt,loff_t *offp)
  46. {
  47.         unsigned long err;
  48.         if(!keypressed){
  49.                 if(filp -> f_flags & O_NONBLOCK)
  50.                         return -EAGAIN;
  51.                 else
  52.                         wait_event_interruptible(button_waitq,keypressed);
  53.         }
  54.         keypressed = 0;

  55.         err = copy_to_user(buf,str,min(strlen(str),cnt));

  56.         return err?(-EFAULT):min(strlen(str),cnt);
  57. }

  58. struct file_operations button_fops = {
  59.         .owner = THIS_MODULE,
  60.         .open  = button_open,
  61.         .read  = button_read,
  62.         .release = button_close,
  63. };

  64. static int __init button_init(void)
  65. {
  66.         dev_t devnr = MKDEV(BUTTONDEVNR,0);
  67.         int err,retval;

  68.         if(button_major){
  69.                 retval = register_chrdev_region(devnr,1,BUTTONDEVNAME);
  70.         } else {
  71.                 retval = alloc_chrdev_region(&devnr,0,1,BUTTONDEVNAME);
  72.         }
  73.         if(retval) {
  74.                 return retval;
  75.         }

  76.         cdev_init(&button_dev,&button_fops);
  77.         button_dev.owner = THIS_MODULE;
  78.         err = cdev_add(&button_dev,devnr,1);
  79.         if(err) {
  80.                 printk("Error  when adding device BUTTON.\n");
  81.         }

  82.         printk("Device "BUTTONDEVNAME" initialized!\n");
  83.         return 0;
  84. }

  85. static void __exit button_exit(void)
  86. {
  87.         cdev_del(&button_dev);
  88.         printk("Button delete successfully!\n");
  89. }

  90. module_init(button_init);
  91. module_exit(button_exit);
复制代码

论坛徽章:
0
5 [报告]
发表于 2011-04-01 09:02 |只看该作者
unregister_chrdev_region

论坛徽章:
0
6 [报告]
发表于 2011-04-01 19:27 |只看该作者
unregister_chrdev_region
EZWORD 发表于 2011-04-01 09:02



    愰然大悟,刚开始写驱动,概念还不够深,谢谢指点:)
现在卸载后,能再次注册,奇怪的是,为什么卸载时总是会提示
  1. rmmod: module 'button' not found
复制代码
后来试了下其他模块,也有这样的提示:
  1. # lsmod
  2. button 2836 0 - Live 0xbf012000 (P)
  3. [# rmmod button
  4. Button delete successfully!
  5. rmmod: module 'button' not found
  6. # lsmod
  7. # insmod button.ko
  8. Device button initialized!
  9. # ls
  10. app_button             led_self               sys
  11. bin                    lib                    syscall
  12. button.ko              linuxrc                test
  13. dev                    mini2440_leds_self.ko  tmp
  14. etc                    mnt                    usr
  15. hello_arm              proc                   var
  16. led                    sbin                   zorroz_led
  17. # insmod mini2440_leds_self.ko
  18. -------------------zorroz-------------insmod: cannot insert 'mini2440_leds_self.ko': Device or resource busy
  19. # lsmod
  20. button 2836 0 - Live 0xbf018000 (P)
  21. # rmmod button
  22. Button delete successfully!
  23. rmmod: module 'button' not found
  24. # lsmod
  25. # insmod mini2440_leds_self.ko
  26. -------------------zorroz-------------zled      initialized# lsmod
  27. mini2440_leds_self 1716 0 - Live 0xbf024000 (P)
  28. # rmmod mini2440_leds_self   
  29. rmmod: module 'mini2440_leds_self' not found
  30. # lsmod
  31. #
复制代码

论坛徽章:
0
7 [报告]
发表于 2011-04-01 19:45 |只看该作者
后来,我又试了一下应用程序模块,也是同样
  1. # ls
  2. app_button             led_self               syscall
  3. bin                    lib                    test
  4. button.ko              linuxrc                tmp
  5. dev                    mini2440_leds_self.ko  usr
  6. etc                    mnt                    var
  7. hello.ko               proc                   zorroz_led
  8. hello_arm              sbin
  9. led                    sys
  10. # insmod hello.ko
  11. Hello World!
  12. # lsmod
  13. hello 1068 0 - Live 0xbf030000
  14. # rmmod hello
  15. hello exit
  16. rmmod: module 'hello' not found
  17. #
复制代码
这是正常现象吗?求解:)

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
8 [报告]
发表于 2011-04-02 11:17 |只看该作者
我的不会这样啊  是不是你的busybox的rmmod有问题呢

论坛徽章:
0
9 [报告]
发表于 2011-04-02 18:23 |只看该作者
我的不会这样啊  是不是你的busybox的rmmod有问题呢
amarant 发表于 2011-04-02 11:17



    在网上搜了一下这个问题,很可能是因为BUSYBOX。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP