【问题标题】:Linux: how do i know the module that exports a device node?Linux:我如何知道导出设备节点的模块?
【发布时间】:2010-05-26 21:10:28
【问题描述】:

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

【问题讨论】:

    标签: linux linux-device-driver


    【解决方案1】:

    简答:

    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

    【讨论】:

      【解决方案2】:

      这个问题的答案很可能因许多因素而异。例如,如果您正在运行 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_mod 内核模块中的 sr 驱动程序提供。我不知道将/dev/cdrom 作为参数并打印sr_mod 作为输出的命令。

      【讨论】:

        猜你喜欢
        • 2014-11-04
        • 1970-01-01
        • 2020-06-21
        • 2021-08-15
        • 1970-01-01
        • 1970-01-01
        • 2018-07-25
        • 2011-09-15
        • 2013-05-01
        相关资源
        最近更新 更多