colorshape 发表于 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 显示已经删除,可是再次添加模块的时候,出错了,添加不了:(
在此求高手解答:)

accessory 发表于 2011-03-31 00:39

先找个自带的LKM模块试试LSMOD, INSMOD, RMMOD. 如果没问题,就看你自己的DEVICE DRIVER的代码,特别是启动和卸载的地方

Trigger_Huang 发表于 2011-03-31 00:41

你把代码贴出来嘛   一起分析分析

colorshape 发表于 2011-03-31 23:25

本帖最后由 colorshape 于 2011-03-31 23:27 编辑

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

static int button_major = BUTTONDEVNR;
struct cdev button_dev;
static int keypressed = 0;
static char *str = "param dev_id in request_irq()";
static struct button_strucbutton_info = {
        .irq = IRQ_EINT8,
        .pin = S3C2410_GPG0,
        .pin_setting = S3C2410_GPG0_EINT8,
        .name = "KEY0",
};
static volatile char keyval;
static DECLARE_WAIT_QUEUE_HEAD(button_waitq);

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

        keyval = (!s3c2410_gpio_getpin(button_info_l->pin))+'0';
        keypressed = 1;
        wake_up_interruptible(&button_waitq);
        return IRQ_RETVAL(IRQ_HANDLED);
}

static int button_open(struct inode *inode,struct file *file)
{
        int err;
        err = request_irq(button_info.irq,button_isr,IRQ_TYPE_EDGE_BOTH,button_info.name,(void *)&button_info);
        if(err) {
                disable_irq(button_info.irq);
                free_irq(button_info.irq,(void *)&button_info);
        }
        keypressed = 0;
        return 0;
}

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

static int button_read(struct file *filp,char __user *buf,size_t cnt,loff_t *offp)
{
        unsigned long err;
        if(!keypressed){
                if(filp -> f_flags & O_NONBLOCK)
                        return -EAGAIN;
                else
                        wait_event_interruptible(button_waitq,keypressed);
        }
        keypressed = 0;

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

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

struct file_operations button_fops = {
        .owner = THIS_MODULE,
        .open= button_open,
        .read= button_read,
        .release = button_close,
};

static int __init button_init(void)
{
        dev_t devnr = MKDEV(BUTTONDEVNR,0);
        int err,retval;

        if(button_major){
                retval = register_chrdev_region(devnr,1,BUTTONDEVNAME);
        } else {
                retval = alloc_chrdev_region(&devnr,0,1,BUTTONDEVNAME);
        }
        if(retval) {
                return retval;
        }

        cdev_init(&button_dev,&button_fops);
        button_dev.owner = THIS_MODULE;
        err = cdev_add(&button_dev,devnr,1);
        if(err) {
                printk("Errorwhen adding device BUTTON.\n");
        }

        printk("Device "BUTTONDEVNAME" initialized!\n");
        return 0;
}

static void __exit button_exit(void)
{
        cdev_del(&button_dev);
        printk("Button delete successfully!\n");
}

module_init(button_init);
module_exit(button_exit);

EZWORD 发表于 2011-04-01 09:02

unregister_chrdev_region

colorshape 发表于 2011-04-01 19:27

unregister_chrdev_region
EZWORD 发表于 2011-04-01 09:02 http://bbs.chinaunix.net/images/common/back.gif


    愰然大悟,刚开始写驱动,概念还不够深,谢谢指点:)
现在卸载后,能再次注册,奇怪的是,为什么卸载时总是会提示rmmod: module 'button' not found后来试了下其他模块,也有这样的提示:# lsmod
button 2836 0 - Live 0xbf012000 (P)
[# rmmod button
Button delete successfully!
rmmod: module 'button' not found
# lsmod
# insmod button.ko
Device button initialized!
# ls
app_button             led_self               sys
bin                  lib                  syscall
button.ko            linuxrc                test
dev                  mini2440_leds_self.kotmp
etc                  mnt                  usr
hello_arm            proc                   var
led                  sbin                   zorroz_led
# insmod mini2440_leds_self.ko
-------------------zorroz-------------insmod: cannot insert 'mini2440_leds_self.ko': Device or resource busy
# lsmod
button 2836 0 - Live 0xbf018000 (P)
# rmmod button
Button delete successfully!
rmmod: module 'button' not found
# lsmod
# insmod mini2440_leds_self.ko
-------------------zorroz-------------zled      initialized# lsmod
mini2440_leds_self 1716 0 - Live 0xbf024000 (P)
# rmmod mini2440_leds_self   
rmmod: module 'mini2440_leds_self' not found
# lsmod
#

colorshape 发表于 2011-04-01 19:45

后来,我又试了一下应用程序模块,也是同样# ls
app_button             led_self               syscall
bin                  lib                  test
button.ko            linuxrc                tmp
dev                  mini2440_leds_self.kousr
etc                  mnt                  var
hello.ko               proc                   zorroz_led
hello_arm            sbin
led                  sys
# insmod hello.ko
Hello World!
# lsmod
hello 1068 0 - Live 0xbf030000
# rmmod hello
hello exit
rmmod: module 'hello' not found
# 这是正常现象吗?求解:):dizzy:

amarant 发表于 2011-04-02 11:17

我的不会这样啊是不是你的busybox的rmmod有问题呢

colorshape 发表于 2011-04-02 18:23

我的不会这样啊是不是你的busybox的rmmod有问题呢
amarant 发表于 2011-04-02 11:17 http://bbs.chinaunix.net/images/common/back.gif


    在网上搜了一下这个问题,很可能是因为BUSYBOX。
页: [1]
查看完整版本: 写驱动时,有关删除模块的问题