Linux: how do i know the module that exports a device node?

后端 未结 2 1652
说谎
说谎 2021-01-30 11:48

If a have a /dev device node and its major/minor numbers how do i know the kernel module name that exported this node?

相关标签:
2条回答
  • 2021-01-30 12:05

    Short answer :

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

    Each device is generally associated with a driver, and this is all what the "device model" is about. The sysfs filesystem contains a representation of this devices and their associated driver. Unfortuantely, it seems not all sysfs have a representation of the device nodes, so this applyd only if your /sys directory contains a /dev directory. Let's take an example, with /dev/video0

    On my board, ls -al /dev/video0 output is

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

    So major number is 81 and minor number is 0. Let's dive into sysfs :

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

    The sys/dev directory contains entry for the char and block devices of the system :

    # 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
    

    What the hell are this links with strange names ? Remember the major and minor number, 81 and 0 ? Let's follow this link :

    #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
    

    Now we can see that this device nod, which is how the device is presented to userspace, is associated with a kernel device. This association is made through a link. If we follow this link, we end up in a directory, with a driver link. The name of the driver is usually the name of the module :

    # 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
    

    So here the name of the module is vpfe_capture

    0 讨论(0)
  • 2021-01-30 12:17

    The answer to this question is most likely different based on a number of factors. For example, if you're running udev, devfs, pre-devfs, etc.

    If you're using Ubuntu (or another equally modern distro) the udevadm command might be what you want.

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

    So, my /dev/cdrom is provided by the sr driver, which resides in the sr_mod kernel module. I don't know of a command that takes /dev/cdrom as an argument and prints sr_mod as output.

    0 讨论(0)
提交回复
热议问题