2012-09-14 4 views
2

ici est LKM chardevice stupide:Chardevice nombre important libérant

#include <linux/module.h> 
#include <linux/init.h> 
#include <linux/cdev.h> 
#include <linux/fs.h> 

MODULE_AUTHOR ("milo"); 
MODULE_DESCRIPTION ("alloc_chrdev_troubleshooting"); 
MODULE_LICENSE("GPL"); 
static int devmajor = 0; 
static char * devname = "chardev_alloc"; 

static int setup_chardevice(void) { 
    int result; 
    dev_t dev; 
    result = alloc_chrdev_region(&dev, 0, 1, devname); 
    if (result < 0) { 
     return result; 
    } 
    printk(KERN_INFO "major is %d", MAJOR(dev)); 
    devmajor = MAJOR(dev); 
    devmajor = result; 
    return 0; 
}; 

void delete_chardevice(void) { 
    unregister_chrdev_region(MKDEV(devmajor, 0), 1); 
}; 

static int __init test_init(void) { 
    int res; 
    res = setup_chardevice(); 
    if (res) { 
     printk(KERN_ERR "couldn't setup chardevice, goodbye."); 
     return res; 
    } 
    printk(KERN_WARNING "chardevice test driver is loaded"); 
    return 0; 
} 
static void __exit test_cleanup(void) { 
    delete_chardevice(); 
    printk(KERN_WARNING "chardevice test driver is unloading"); 
    return; 
} 

module_init(test_init); 
module_exit(test_cleanup); 

après avoir fait rmmod grand nombre de périphériques ne sont pas DEALLOCATED et je peux le voir dans /proc/devices. il est vraiment gênant ... Voici Makefile pour test rapide:

KDIR ?= /lib/modules/`uname -r`/build 
obj-m += chartest.o 
chartest-objs := main.o 
default: all 
modules: 
    $(MAKE) -C $(KDIR) M=$(PWD) modules 
modules_clean: 
    $(MAKE) -C $(KDIR) M=$(PWD) clean 
all: modules 
clean: modules_clean 

qu'ai-je fait de mal? veuillez suggérer.

Répondre

3
devmajor = MAJOR(dev); 
devmajor = result; 

Vous écrasez la variable devmajor avec la valeur de retour de alloc_chrdev_region() alloc_chrdev_region() renvoie 0, pas le nombre important.

Vous essayez ensuite de libérer le périphérique MKDEV (devmajor, 0), qui est probablement MKDEV (0, 0) si alloc_chrdev_region a réussi, au lieu de votre périphérique.

+0

honte à moi! C'était vraiment une erreur stupide! merci beaucoup pour votre aide! – milo