Почему /dev и /proc/devices имеют совершенно разные выходные данные в Linux

Почему /dev и /proc/devices имеют совершенно разные выходные данные в Linux

Насколько я знаю:

  • Один драйвер может быть связан с одним или несколькими «устройствами».

  • Файлы в /dev files представляют эти устройства. Драйвер имеет основной номер, а каждое устройство также имеет дополнительный номер, поэтому (основной, дополнительный) идентифицирует одно устройство.

  • /proc/devices также содержит список устройств.

Если то, что я знаю, правда, то:

Почему /dev и /proc/devices имеют совершенно разные выходные данные? В dev есть имя устройства, старший номер и младший номер. А в /proc/devices есть старший номер и имя устройства, но не младший номер. Почему эти два списка показывают совершенно разные выходные данные даже для одного и того же старшего номера?

Например, посмотрите на эту строку в ls -l /dev

crw------- 1 root root     10, 235 Sep 19 21:40 autofs

Это символьное устройство со старшим номером 10 и младшим номером 235. Имя устройства — autofs.

Теперь я проверяю запись с тем же старшим номером в /proc/devices:

10 misc

Как видите, имя устройства совершенно другое, и нет младшего номера (как это идентифицирует устройство только по старшему номеру?).

Кажется, какая-то терминология перепутана, но я не смог решить эту проблему.

решение1

Модули ядра («драйверы», если хотите) могут регистрировать блочные или символьные устройства (в традиционном смысле unix, «устройство» — это слово со многими значениями) в ядре, используя процедуру, подобную register_blkdevвместе со строкой, которая должна идентифицировать устройство. Можно использоватьлюбойstring для этой цели, и эти строки отображаются в /proc/devicesфайле (который является просто текстовым представлением этой таблицы ядра).

С другой стороны, в современных системах Linux файлы /devсоздаются с udevпомощью ряда сложных правил. Предполагается, что эти файлы представляют способы взаимодействия пользовательского пространства с ядром через чтение, запись и ioctl, что работает, поскольку это «специальные» файлы с главным и второстепенным номером устройства, поэтому доступ к этим файлам преобразуется в вызовы ядра (грубо говоря).

Эти два и их структура совершенно не связаны. Единственная связь заключается в том, что главный номер устройства такого специального файла ищется всякий раз, когда к такому файлу обращаются, и используется для поиска модуля, который его зарегистрировал. Строка, под которой он был зарегистрирован, совершенно не имеет значения. Имя, под которым появляется файл, также совершенно не имеет значения, если пользователь знает это имя. Ничто не мешает вам называть ваши диски /dev/this-diskи /dev/that-diskвместо /dev/sdaи, /dev/sdbесли вы чувствуете желание сделать это, и изменить udevправила.

НоконечноЛюди любят упрощать вещи, поэтому строки, которые используются для регистрации устройств, часто совпадают или, по крайней мере, похожи на имена по умолчанию, под которыми они отображаются в /dev. Но это единственная связь.

Связанный контент