如何从/ proc / devices中删除动态分配的主号码?

时间:2014-10-25 17:51:24

标签: linux-kernel linux-device-driver

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

注册一个动态主编号
    register_chrdev(0, "xxxxx", &xxxxx);

并使用

取消注册我的模块
    unregister_chrdev(0. "xxxxx");

当我使用insmod加载我的驱动程序时,我收到了动态主编号,例如243,以及rmmod之后的成功删除模块。

但是,删除模块/proc/devices后仍显示主要编号(243)。

如何删除我的驱动程序以从/proc/devices列表中删除其主要号码?

1 个答案:

答案 0 :(得分:3)

当您使用0作为请求分配动态主编号的第一个参数调用register_chrdev()时,返回值将是您应保存的指定主编号。

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

您可以在http://www.tldp.org/LDP/lkmpg/2.6/html/x569.html看到一个完整的示例,关键部分是:

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

另请注意,这种注册设备的方法被认为已过时 - 您可能希望研究更新的方法。