【问题标题】:How to remove dynamically assigned major number from /proc/devices?如何从 /proc/devices 中删除动态分配的主要号码?
【发布时间】:2014-10-26 05:27:34
【问题描述】:

在我的内核驱动程序项目中,我通过调用注册一个动态主号码

    register_chrdev(0, "xxxxx", &xxxxx);

并注销我的模块

    unregister_chrdev(0. "xxxxx");

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

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

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

【问题讨论】:

  • 这是一个 programming 网站,这个问题与 Stack Overflow 无关,因为它似乎与编程无关,试试 Super用户。 请注意:如果没有关于您正在尝试做什么的进一步信息,超级用户将不会接受此问题。目前在任何 Stack Exchange 上都存在 网站,不清楚这个问题在问什么。
  • @cybermonkey - 不正确,这是一个涉及编写自定义内核模块的编程问题,特别是为什么在其删除方法中的 unregister 函数调用没有被清理(并且通过扩展,如果它应该被清理)预期或需要什么其他函数调用)。 “不清楚”来自您对内核编程的不熟悉。
  • @ChrisStratton 这个问题还没有解释清楚,也没有研究工作。
  • 再次不真实 - 发布者已经研究了创建设备所需的函数调用,并且在反向操作方面遇到困难 - 编写和测试代码正是鼓励的。很明显,不是目标受众,但你也不是网站成员的全部。你可能更乐意将注意力集中在你熟悉的主题上,而把其他人留给那些对他们有所了解。

标签: linux-kernel linux-device-driver


【解决方案1】:

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

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

您可以在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);
}

另请注意,这种注册设备的方法已过时 - 您可能需要研究更新的方法。

【讨论】:

  • 并非所有 unregister_chrdev 的实现都返回一个 int。请参阅此 SO 问题 [stackoverflow.com/questions/3237384/…Linux 2.6.12 是函数开始返回 void 的时间。以前它总是返回 0,所以改变它的返回类型不会丢失任何东西。我也不怪任何人遵循 TLDP。我确实注意到它只涵盖内核版本 2.4.x 和 2.6.x。
猜你喜欢
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-13
  • 2011-07-23
  • 2016-05-02
  • 2018-05-01
  • 2018-07-10
相关资源
最近更新 更多