Linux kernel 如何从/proc/devices中删除动态分配的主要编号?

Linux kernel 如何从/proc/devices中删除动态分配的主要编号?,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,在我的内核驱动程序项目中,我通过调用 register_chrdev(0, "xxxxx", &xxxxx); 并将我的模块注销到 unregister_chrdev(0. "xxxxx"); 当我用insmod加载驱动程序时,我收到了动态主要编号,例如243,并且在rmmod之后,成功删除模块 但是,在卸下模块后,/proc/devices仍然显示主编号(243) 如何从/proc/devices?的列表中删除我的驱动程序以同时删除其主要编号?当您使用0作为第一个参

在我的内核驱动程序项目中,我通过调用

    register_chrdev(0, "xxxxx", &xxxxx);
并将我的模块注销到

    unregister_chrdev(0. "xxxxx");
当我用
insmod
加载驱动程序时,我收到了动态主要编号,例如243,并且在
rmmod
之后,成功删除模块

但是,在卸下模块后,
/proc/devices
仍然显示主编号(243)


如何从
/proc/devices

的列表中删除我的驱动程序以同时删除其主要编号?当您使用0作为第一个参数调用register_chrdev()以请求分配动态主要编号时,返回值将是分配的主要编号,您应该保存该编号

然后,当调用unregister_chrdev()时,应将保存的主要编号作为参数传递,而不是传递给您的0。还要确保设备名参数匹配。请注意,此函数将返回一个结果,您可以检查该结果的状态/失败-在后一种情况下,您肯定希望打印k()一条消息,以便知道您的代码尚未完成其目标

您可以在上看到一个完整的示例,其关键部分包括:

static int Major;       /* Major number assigned to our device driver */

int init_module(void)
{
        Major = register_chrdev(0, DEVICE_NAME, &fops);

    if (Major < 0) {
      printk(KERN_ALERT "Registering char device failed with %d\n", Major);
      return Major;
    }
    return SUCCESS;
}

void cleanup_module(void)
{
    int ret = unregister_chrdev(Major, DEVICE_NAME);
    if (ret < 0)
        printk(KERN_ALERT "Error in unregister_chrdev: %d\n", ret);
}
static int-Major;/*分配给设备驱动程序的主要编号*/
int init_模块(void)
{
主要=寄存器\u chrdev(0,设备名称和fops);
如果(主要<0){
printk(KERN_警报“注册字符设备失败,错误为%d\n”,主要错误);
返回专业;
}
回归成功;
}
空洞清理_模块(空洞)
{
int-ret=注销chrdev(主要设备名称);
如果(ret<0)
printk(内核警报“注销chrdev时出错:%d\n”,ret);
}

还要注意,这种注册设备的方法被认为是过时的-您可能需要研究更新的方法。

这是一个编程网站,这个问题与堆栈溢出无关,因为它似乎与编程无关,请尝试超级用户。请注意:如果没有关于您试图做什么的进一步信息,超级用户将不会接受此问题。由于它目前位于任何Stack Exchange站点上,不清楚这个问题是什么。@cybermonkey-不正确,这是一个涉及编写自定义内核模块的编程问题,特别是为什么其删除方法中的unregister函数调用没有清理(如果应该这样做或者需要什么其他函数调用,也可以扩展为“不一致性”)这是因为您对内核编程不熟悉。@ChrisStratton这个问题还没有解释清楚,也没有显示出任何研究成果。再次,这是不真实的——海报研究了创建设备所需的函数调用,并且在反向操作方面遇到了困难——编写和测试代码正是问题所在是鼓励的。很明显,你不是目标受众,但你不是网站的全体成员。你可能会更乐意将注意力集中在熟悉的话题上,而将其他话题留给了解这些话题的人。并非所有unregister_chrdev的实现都会返回一个int。请看这个问题[Linux 2.6.12是当函数开始返回void时。以前它总是返回0,因此更改其返回类型不会丢失任何内容。我也不责怪任何人遵循TLDP。我注意到它只涵盖内核版本2.4.x和2.6.x。