【发布时间】:2012-12-21 00:35:53
【问题描述】:
我正在尝试在块 io 中添加一些调试消息以跟踪 linux 内核中的 io 操作。
IO 可能发生在多个块设备上,我有 dev_t 值。
我可以从dev_t获得主要和次要号码。
我想知道有没有办法使用这些主要和次要编号从/dev/ dir 获取设备文件名?
当然,我需要内核 API。
【问题讨论】:
标签: linux linux-kernel
我正在尝试在块 io 中添加一些调试消息以跟踪 linux 内核中的 io 操作。
IO 可能发生在多个块设备上,我有 dev_t 值。
我可以从dev_t获得主要和次要号码。
我想知道有没有办法使用这些主要和次要编号从/dev/ dir 获取设备文件名?
当然,我需要内核 API。
【问题讨论】:
标签: linux linux-kernel
您也可以使用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,因此这并不能真正回答问题。
一般来说,您无法进行如此简单的反向映射。这是因为知道一些主要和主要数字,总是可以使用mknod在任何地方创建有效的设备文件,不一定在/dev下。
归根结底,内核并不关心具有特定主要/次要的任何特定设备节点是如何产生的——这样的节点只是内核设备驱动程序的入口点,可以处理这个硬件或软件设备。
当然,实际上在大多数现代 Linux 系统上,大多数设备节点位于 /dev 并由 udev 维护 - 但它是用户空间守护进程,您的内核驱动程序无法与之通信。另请注意,udev 可以配置为创建具有任何名称的新设备节点。
【讨论】: