【问题标题】:How to get a device file name using major and minor number如何使用主要和次要编号获取设备文件名
【发布时间】:2012-12-21 00:35:53
【问题描述】:

我正在尝试在块 io 中添加一些调试消息以跟踪 linux 内核中的 io 操作。

IO 可能发生在多个块设备上,我有 dev_t 值。

我可以从dev_t获得主要和次要号码。

我想知道有没有办法使用这些主要和次要编号从/dev/ dir 获取设备文件名?

当然,我需要内核 API。

【问题讨论】:

    标签: linux linux-kernel


    【解决方案1】:

    很简单:

    1. 使用bdget 函数通过dev_t 查找block_device。
    2. 使用bdevname 获取设备名称。
    3. 使用bdput 放置设备引用。

    玩得开心。

    【讨论】:

    • 是否可以在用户空间执行此操作?
    【解决方案2】:

    您也可以使用libudev。由于您已经拥有dev_t id,因此这种方式更加简单。

    #include <libudev.h>
    
    // Create the udev context.
    struct udev *udev = udev_new();
    
    // Create de udev_device from the dev_t.
    struct udev_device *dev = udev_device_new_from_devnum(udev, 'b', sb.st_dev);
    
    // Finally obtain the node.
    const char* node  = udev_device_get_devnode(dev);
    
    udev_unref(udev);
    

    【讨论】:

    • 请注意,libudev 是一个用户空间库,而 OP 在内核空间中工作,因此明确要求 kernel API,因此这并不能真正回答问题。
    【解决方案3】:

    一般来说,您无法进行如此简单的反向映射。这是因为知道一些主要和主要数字,总是可以使用mknod在任何地方创建有效的设备文件,不一定在/dev下。

    归根结底,内核并不关心具有特定主要/次要的任何特定设备节点是如何产生的——这样的节点只是内核设备驱动程序的入口点,可以处理这个硬件或软件设备。

    当然,实际上在大多数现代 Linux 系统上,大多数设备节点位于 /dev 并由 udev 维护 - 但它是用户空间守护进程,您的内核驱动程序无法与之通信。另请注意,udev 可以配置为创建具有任何名称的新设备节点。

    【讨论】:

      猜你喜欢
      • 2012-06-24
      • 1970-01-01
      • 2010-12-21
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      相关资源
      最近更新 更多