2

ここにダム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

私は何を間違えましたか?提案してください。

4

1 に答える 1

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

devmajor 変数を alloc_chrdev_region() の戻り値で上書きしています alloc_chrdev_region() は、メジャー番号ではなく、成功時に 0 を返します。

次に、デバイスの代わりにデバイス MKDEV(devmajor, 0) を解放しようとしています。alloc_chrdev_region が成功した場合、これはおそらく MKDEV(0, 0) です。

于 2012-09-14T10:02:22.153 に答える