/ dev / input - ¿Qué es exactamente esto?

12

Tenía curiosidad acerca de cómo el hardware interactúa con el sistema operativo y encontré esta publicación: ¿Cómo funcionan la entrada del teclado y la salida de texto?

Parece que gran parte de la magia ocurre en el directorio / dev / input. Decidí echar un vistazo a mi propio sistema operativo (Ubuntu 16.10) para ver qué podía descubrir. Todos estos archivos están listados como 0 bytes, y cuando lo hago sudo cat mouse0 | hexdump -C, obtengo un montón de hexdatos que se ven así:

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..............|

Entonces tengo algunas preguntas:

  1. ¿Cuál es el propósito de este archivo? Me parece que estos archivos de dispositivo solo se usan como intermediarios para transferir el código de escaneo desde el kernel al servidor X. ¿Por qué no simplemente enviarlo directamente desde el kernel al servidor X?

  2. ¿Por qué hay tantos? Tengo un poco más de 20 archivos de eventos individuales, pero solo un teclado y mouse.

Astrum
fuente

Respuestas:

17

Iré con la pregunta en orden inverso:

  1. ¿Por qué hay tantos?

Esos son dispositivos que representan la mayoría de las entradas presentes en una máquina (hay otros, por ejemplo, no se administrará un micrófono /dev/input). Contrariamente a la suposición de que un teclado más un mouse darían 2 dispositivos, incluso el teclado más simple y el mouse más simple aún darían 6 de ellos.

¿Por qué 6? Porque Xorg creará un teclado de entrada de prueba y un mouse de entrada de prueba (ambos virtuales) durante su inicio. Además, agregará el teclado de prueba con el teclado real en un dispositivo virtual principal. es decir, realizará muxing de la entrada. Lo mismo sucederá con la prueba y el mouse real.

Además, una computadora típica (computadora de escritorio o portátil) tiene otros botones además del teclado: botón de encendido, botón de suspensión.

Los eventNdispositivos allí son dispositivos para las cosas que Xorg crea y para lo que tiene la computadora. El Nproviene de ID secuenciales y es análoga a la ID en xinput. Por ejemplo, en mi máquina tengo:

[~]# 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

Y xinputme da identificaciones análogas:

[~]$ 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)]

(Mira que eventNcorresponde a id=N)

Sin Xorg

1.1 ¿Cuál es el propósito de este archivo?

Tenga en cuenta que todas las entradas aleatorias (incluida mi cámara USB) son vistas por Xorg como parte del teclado virtual. Esto permite la entrada de muxing y demuxing. Por ejemplo, puedo mover mi mouse a través de mi mouse USB o mi trackpad y una aplicación no necesita saber la diferencia.

(El hecho de que la cámara USB sea parte del teclado virtual se debe a que tiene un botón para encenderla y apagarla. Y como es un botón, se convierte en parte del subsistema del teclado. La entrada de video real se maneja /sys/class/video4linux. )

En otras palabras, para una aplicación realmente solo hay un teclado y un solo mouse. Pero tanto Xorg como el núcleo necesitan saber las diferencias. Y esto lleva a la última parte:

1.2 ¿Por qué no simplemente enviarlo directamente desde el kernel al servidor X?

Porque Xorg necesita saber la diferencia.

Y hay situaciones en las que es útil. Puede reasignar claves en Xorg a cada dispositivo de entrada esclavo de manera diferente. Por ejemplo, tengo un juego de juego con pedales, cuando se usa en un juego de carreras a, by cpara cada uno de sus pedales. Sin embargo, cuando programo reasignar estas teclas a Esc, Ctrly Alt, sin reasignar las teclas en el teclado mismo.

Además, no es necesario que una máquina ejecute Xorg. Por ejemplo, en un servidor sin cabeza puedo obtener el siguiente resultado:

[~]$ 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

Donde los dispositivos de entrada corresponden a puertos serie (especialmente en este caso, lo hacen) en lugar de teclado o mouse.

grochmal
fuente
3
El soporte de la cámara en sí (como en la recuperación de video) no pasa por el subsistema de entrada, sino por V4L2. Las cámaras son dispositivos de entrada de teclado porque a veces tienen botones, y esos actúan como teclas ...
Stephen Kitt
@StephenKitt - Wow, sí. Nunca me entrometí con el subsistema de cámara, pero ahora puedo ver / sys / class / video4linux. Hay algunas interfaces interesantes allí. Gracias por la info! (He actualizado la respuesta y eliminé la parte engañosa).
grochmal
Xorg no crea archivos de dispositivo: no es un controlador. En cambio, los abre y hace el IO a través de ellos. Se vuelve realmente obvio cuando inicia la máquina sin X y todavía ve estos dispositivos (y puede ejecutarse, por ejemplo gpm).
Ruslan
@Ruslan ¿por qué necesitaría un controlador para crear archivos de dispositivo? Puedo crear un dispositivo de bloque usando un montaje de bucle, por ejemplo. Los dispositivos todavía estarían allí sin X, pero los archivos reales del dispositivo (en los núcleos modernos) no. X usará udev bien, pero las reglas de udev para un mouse, por ejemplo, no se ejecutarán si arranca sin X.
grochmal
Acabo de ejecutar Ubuntu 18.04 Live sin lanzar X en absoluto. Todavía puedo ver estos archivos. Una vez más: el mouse puede funcionar sin X, ver, por ejemplo, el gpmdemonio o GTK2 en framebuffer.
Ruslan
2

No existe tal cosa como "enviarlo directamente". Las aplicaciones deben tener algún método para leer los datos, y en Unix se hace de la misma manera que leen los archivos normales creando un nodo de dispositivo que funciona con las llamadas normales del sistema de archivos IO para permitir que las aplicaciones los abran y los lean.

Hay otras fuentes de entrada además del mouse y el teclado. Puede averiguar qué es cada uno mirando /sys/class/input. Allí podrá ajustar archivos con esos mismos nombres inputNN que son enlaces simbólicos a otro nodo en el sysfs que describe el dispositivo que representan. Otras fuentes comunes incluyen tarjetas de sonido (que señalan cuando las cosas están conectadas y desconectadas) y el botón de encendido físico en la computadora.

psusi
fuente