Linux: откуда мне знать модуль, который экспортирует узел устройства? - PullRequest
23 голосов
/ 26 мая 2010

Если есть узел устройства / dev и его старшие / младшие номера, как узнать имя модуля ядра, который экспортировал этот узел?

Ответы [ 2 ]

24 голосов
/ 26 мая 2010

Краткий ответ:

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 содержит запись для char и block устройств системы:

# 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

Теперь мы можем видеть, что этот nod устройства, то есть то, как устройство представляется пользовательскому пространству, связан с устройством ядра. Эта ассоциация сделана через ссылку. Если мы перейдем по этой ссылке, мы окажемся в каталоге со ссылкой на драйвер. В качестве имени драйвера обычно используется название модуля:

# 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 голосов
/ 26 мая 2010

Ответ на этот вопрос, скорее всего, отличается в зависимости от ряда факторов. Например, если вы используете 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 в качестве вывода.

...