gpt4 book ai didi

Chardevice 主要号码释放

转载 作者:太空狗 更新时间:2023-10-29 12:05:58 24 4
gpt4 key购买 nike

这是愚蠢的 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

我做错了什么?请提出建议。

最佳答案

devmajor = MAJOR(dev);
devmajor = result;

你正在用 alloc_chrdev_region() 的返回值覆盖 devmajor 变量alloc_chrdev_region() 成功返回 0,而不是主编号。

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

关于Chardevice 主要号码释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12421107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com