Linux отслеживает, в каких регионах выделен определенный драйвер. В противном случае совместное использование старшего номера, как это происходит в областях vc, serial (maj 4) и ttyaux (maj 5), было бы невозможно без дополнительного модуля диспетчеризации или чего-то подобного. В fs/char_dev.c
вы найдете
kobj = kobj_lookup(cdev_map, inode->i_rdev, &idx);
так что, действительно, Linux ищет объекты cdev (основной, второстепенный), а не только (основной).
См. /sys/dev/char/
, например:
lrwxrwxrwx 1 root root 0 Mar 27 17:34 4:62 -> ../../devices/virtual/tty/tty62
lrwxrwxrwx 1 root root 0 Mar 27 17:34 4:63 -> ../../devices/virtual/tty/tty63
lrwxrwxrwx 1 root root 0 Mar 27 17:34 4:64 -> ../../devices/pnp0/00:06/tty/ttyS0
lrwxrwxrwx 1 root root 0 Mar 27 17:34 4:65 -> ../../devices/platform/serial8250/tty/ttyS1
lrwxrwxrwx 1 root root 0 Mar 27 17:34 4:66 -> ../../devices/platform/serial8250/tty/ttyS2
...
lrwxrwxrwx 1 root root 0 Mar 27 17:34 4:79 -> ../../devices/platform/serial8250/tty/ttyS15
Поскольку я настроил свое ядро на CONFIG_SERIAL_8250_NR_UARTS=16
, CONFIG_SERIAL_8250_RUNTIME_UARTS=16
, я буду видеть записи вплоть до ttyS15 в каталоге sysfs. Это то, что драйвер устройства зарегистрировал в результате моих действий по настройке. Это может быть меньше, чем зарезервировано в соответствии с Documentation/devices.txt
.