/ dev / input - что это такое?

12

Мне было любопытно, как аппаратное обеспечение взаимодействует с ОС, и наткнулся на этот пост: как работает ввод с клавиатуры и вывод текста?

Кажется, что много магии происходит в каталоге / dev / input. Я решил взглянуть на свою собственную ОС (Ubuntu 16.10), чтобы увидеть, что я могу узнать. Все эти файлы перечислены как 0 байтов, и когда я это делаю, sudo cat mouse0 | hexdump -Cя получаю тонну шестнадцатеричных данных, которые выглядят так:

00000000  b3 82 8a 58 00 00 00 00  53 74 09 00 00 00 00 00  |...X....St......|
00000010  01 00 1c 00 00 00 00 00  b3 82 8a 58 00 00 00 00  |...........X....|
00000020  53 74 09 00 00 00 00 00  00 00 00 00 00 00 00 00  |St..............|
00000030  b6 82 8a 58 00 00 00 00  06 56 0e 00 00 00 00 00  |...X.....V......|
00000040  01 00 10 00 01 00 00 00  b6 82 8a 58 00 00 00 00  |...........X....|
00000050  06 56 0e 00 00 00 00 00  00 00 00 00 00 00 00 00  |.V..............|

Итак, у меня есть несколько вопросов:

  1. Какова цель этого файла? Мне кажется, что эти файлы устройств используются только как посредники для передачи скан-кода из ядра на X-сервер. Почему бы просто не отправить его прямо из ядра на X-сервер?

  2. Почему их так много? У меня есть чуть более 20 отдельных файлов событий, но только одна клавиатура и мышь.

Astrum
источник

Ответы:

17

Я пойду с вопросом в обратном порядке:

  1. Почему их так много?

Это устройства, которые соответствуют большинству входов, присутствующих в машине (есть другие, например, микрофон не будет управляться /dev/input). Вопреки предположению, что одна клавиатура плюс одна мышь дадут 2 устройства, даже самая простая клавиатура и самая простая мышь все равно дадут 6 из них.

Почему 6? Потому что Xorg создаст тестовую клавиатуру ввода и тестовую мышь ввода (обе виртуальные) во время своего запуска. Кроме того, он объединит тестовую клавиатуру с реальной клавиатурой в основное виртуальное устройство. т.е. он будет выполнять муксинг ввода. То же самое произойдет с тестовой и реальной мышью.

Кроме того, на типичном компьютере (настольном компьютере или ноутбуке) помимо клавиатуры имеются другие кнопки: кнопка питания, кнопка сна.

Эти eventNустройства в есть устройства для вещей , которые Xorg создает и для того, что компьютер есть. NПриходит из последовательных идентификаторов и аналогично идентификаторы в xinput. Например на моей машине у меня есть:

[~]# ls -l /dev/input/
total 0
drwxr-xr-x 2 root root     100 Jan 26 16:01 by-id
drwxr-xr-x 2 root root     140 Jan 26 16:01 by-path
crw-rw---- 1 root input 13, 64 Jan 26 16:01 event0
crw-rw---- 1 root input 13, 65 Jan 26 16:01 event1
crw-rw---- 1 root input 13, 74 Jan 26 16:01 event10
crw-rw---- 1 root input 13, 75 Jan 26 16:01 event11
crw-rw---- 1 root input 13, 76 Jan 26 16:01 event12
crw-rw---- 1 root input 13, 77 Jan 26 16:01 event13
crw-rw---- 1 root input 13, 66 Jan 26 16:01 event2
crw-rw---- 1 root input 13, 67 Jan 26 16:01 event3
crw-rw---- 1 root input 13, 68 Jan 26 16:01 event4
crw-rw---- 1 root input 13, 69 Jan 26 16:01 event5
crw-rw---- 1 root input 13, 70 Jan 26 16:01 event6
crw-rw---- 1 root input 13, 71 Jan 26 16:01 event7
crw-rw---- 1 root input 13, 72 Jan 26 16:01 event8
crw-rw---- 1 root input 13, 73 Jan 26 16:01 event9
crw-rw---- 1 root input 13, 63 Jan 26 16:01 mice
crw-rw---- 1 root input 13, 32 Jan 26 16:01 mouse0
crw-rw---- 1 root input 13, 33 Jan 26 16:01 mouse1

И xinputдает мне аналогичные идентификаторы:

[~]$ xinput list
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB Optical Mouse                id=10   [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=14   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ Sleep Button                              id=9    [slave  keyboard (3)]
    ↳ USB 2.0 Camera                            id=11   [slave  keyboard (3)]
    ↳ Asus Laptop extra buttons                 id=12   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=13   [slave  keyboard (3)]

(Смотри что eventNсоответствует id=N)

Без Xorg

1.1 Какова цель этого файла?

Обратите внимание, что все случайные входы (включая мою USB-камеру!) Рассматриваются Xorg как часть виртуальной клавиатуры. Это позволяет мультиплексировать и демультиплексировать ввод. Например, я могу перемещать мышь через USB-мышь или трекпад, и приложение не должно знать разницу.

(Тот факт, что USB-камера является частью виртуальной клавиатуры, объясняется тем, что она имеет кнопку для включения и выключения. А поскольку она является кнопкой, она становится частью подсистемы клавиатуры. Фактический видеовход обрабатывается /sys/class/video4linux. )

Другими словами, для приложения действительно есть только одна клавиатура и только одна мышь. Но и Xorg, и ядро ​​должны знать различия. И это приводит к последней части:

1.2 Почему бы просто не отправить его прямо из ядра на X-сервер?

Потому что Xorg должен знать разницу.

И есть ситуации, в которых это полезно. Вы можете переназначить ключи в Xorg на каждое ведомое устройство ввода по-разному. Например, у меня есть игровой набор с педалью, когда используются в гоночной игре выдает a, bи cдля каждого из его педалей. Тем не менее, при программировании я переназначаю эти клавиши Esc, Ctrlи Alt, без переназначения клавиш на самой клавиатуре.

Кроме того, не обязательно, чтобы на машине работал Xorg. Например, на безголовом сервере я могу получить следующий вывод:

[~]$ ls -l /dev/input/
total 0
drwxr-xr-x 2 root root      80 Nov  8 02:36 by-path
crw-rw---- 1 root input 13, 64 Nov  8 02:36 event0
crw-rw---- 1 root input 13, 65 Nov  8 02:36 event1
crw-rw---- 1 root input 13, 66 Nov  8 02:36 event2

Где устройства ввода соответствуют последовательным портам (особенно в этом случае они делают) вместо клавиатуры или мыши.

grochmal
источник
3
Сама поддержка камеры (как при получении видео) проходит не через подсистему ввода, а через V4L2. Камеры являются устройствами ввода с клавиатуры, потому что они иногда имеют кнопки, и они действуют как клавиши ...
Стивен Китт
@StephenKitt - Ух ты, да. Я никогда не вмешивался в подсистему камеры, но теперь я вижу / sys / class / video4linux. Там есть несколько интересных интерфейсов. Спасибо за информацию! (Я обновил asnwer и удалил вводящую в заблуждение часть).
grochmal
Xorg не создает файлы устройств: это не драйвер. Вместо этого он открывает их и выполняет IO через них. Это становится действительно очевидным, когда вы запускаете машину без X вообще и по-прежнему видите эти устройства (и можете запустить, например gpm).
Руслан
@ Руслан Зачем мне нужен драйвер для создания файлов устройства? Я могу создать блочное устройство, используя, например, петлевое крепление. Устройства все еще были бы в порядке без X, но фактические файлы устройств (в современных ядрах) не будут. X будет использовать udev нормально, но правила udev для мыши, например, не будут выполняться при загрузке без X.
grochmal
Я только что запустил Ubuntu 18.04 Live без запуска X вообще. Я до сих пор вижу эти файлы. Еще раз: мышь может работать без X, см., Например, gpmдемон или GTK2 на кадровом буфере.
Руслан
2

Не существует такой вещи, как «отправить его напрямую». У приложений должен быть какой-то метод чтения данных, и в Unix это делается так же, как они читают обычные файлы, создавая узел устройства, который работает с обычными системными вызовами ввода-вывода, чтобы позволить приложениям открывать и читать их.

Есть и другие источники ввода, кроме мыши и клавиатуры. Вы можете узнать, что каждый из них, посмотрев /sys/class/input. Там вы найдете файлы с теми же именами inputNN, которые являются символическими ссылками на другой узел в sysfs, который описывает устройство, которое они представляют. Другими распространенными источниками являются звуковые карты (которые сигнализируют, когда что-то подключено и отключено) и кнопка физического питания на компьютере.

psusi
источник