Chardevice主要号码解放

时间:2012-09-14 08:54:16

标签: c linux kernel linux-device-driver kernel-module

这里是dumb chardevice lkm:

#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);

执行rmmod后,主设备号未被解除分配,我可以在/proc/devices中看到它。真的很烦人...... 以下是Makefile进行快速测试:

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

我做错了什么?拜托,建议。

1 个答案:

答案 0 :(得分:3)

devmajor = MAJOR(dev);
devmajor = result;

您使用alloc_chrdev_region()的返回值覆盖devmajor变量 alloc_chrdev_region()在成功时返回0,而不是主要数字。

然后,您尝试释放设备MKDEV(devmajor,0),如果alloc_chrdev_region成功,则可能是MKDEV(0,0),而不是您的设备。