24

如果有一个 /dev 设备节点及其主要/次要编号,我如何知道导出该节点的内核模块名称?

4

2 回答 2

26

简短的回答:

cd /sys/dev/char/major:minor/device/driver/
ls -al | grep module

每个设备通常都与一个驱动程序相关联,这就是“设备模型”的全部内容。sysfs文件系统包含此设备及其相关驱动程序的表示。不幸的是,似乎并非所有的 sysfs 都有设备节点的表示,所以这仅适用于 /sys 目录包含 /dev 目录的情况。让我们举个例子,与/dev/video0

在我的板上,ls -al /dev/video0输出是

crw-------    1 root     root      81,   0 Jan  1 00:00 video0

所以主要编号是 81,次要编号是 0。让我们深入了解 sysfs :

# cd /sys
# ls
block     class     devices   fs        module
bus       dev       firmware  kernel

sys/dev目录包含系统的字符设备和块设备的条目:

# cd dev
# cd char
# ls
10:61  13:64  1:3    1:8    249:0  252:0  29:0   4:65   81:0   89:1
10:62  1:1    1:5    1:9    250:0  253:0  29:1   5:0    81:2
10:63  1:11   1:7    248:0  251:0  254:0  4:64   5:1    81:3

这到底是什么与奇怪的名字链接?还记得主要和次要数字 81 和 0 吗?让我们按照这个链接:

#cd major:minor (ie 81:0)
#ls -al
drwxr-xr-x    2 root     root            0 Jan  1 01:56 .
drwxr-xr-x    3 root     root            0 Jan  1 01:56 ..
-r--r--r--    1 root     root         4096 Jan  1 01:56 dev
lrwxrwxrwx    1 root     root            0 Jan  1 01:56 device -> ../../../vpfe-capture
-r--r--r--    1 root     root         4096 Jan  1 01:56 index
-r--r--r--    1 root     root         4096 Jan  1 01:56 name
lrwxrwxrwx    1 root     root            0 Jan  1 01:56 subsystem -> ../../../../../class/video4linux
-rw-r--r--    1 root     root         4096 Jan  1 01:56 uevent

现在我们可以看到这个设备节点,即设备呈现给用户空间的方式,与内核设备相关联。这种关联是通过链接建立的。如果我们点击这个链接,我们最终会进入一个带有驱动程序链接的目录。驱动程序的名称通常是模块的名称:

# ls -al
drwxr-xr-x    3 root     root            0 Jan  1 01:56 .
drwxr-xr-x   25 root     root            0 Jan  1 00:00 ..
lrwxrwxrwx    1 root     root            0 Jan  1 01:56 driver -> ../../../bus/platform/drivers/vpfe-capture
-r--r--r--    1 root     root         4096 Jan  1 01:56 modalias
lrwxrwxrwx    1 root     root            0 Jan  1 01:56 subsystem -> ../../../bus/platform
-rw-r--r--    1 root     root         4096 Jan  1 01:56 uevent
drwxr-xr-x    3 root     root            0 Jan  1 01:56 video4linux

所以这里模块的名称是 vpfe_capture

于 2010-05-26T13:10:28.970 回答
4

基于许多因素,这个问题的答案很可能会有所不同。例如,如果您正在运行 udev、devfs、pre-devfs 等。

如果您使用的是 Ubuntu(或另一个同样现代的发行版),那么该udevadm命令可能就是您想要的。

% udevadm info -q path -n /dev/cdrom
/devices/pci0000:00/0000:00:1f.1/host3/target3:0:0/3:0:0:0/block/sr0

因此,我的 /dev/cdrom 由sr位于sr_mod内核模块中的驱动程序提供。我不知道/dev/cdrom作为参数并sr_mod作为输出打印的命令。

于 2010-05-26T08:12:01.143 回答