/ dev / input - Was genau ist das?

12

Ich war neugierig, wie Hardware mit dem Betriebssystem interagiert, und bin auf diesen Beitrag gestoßen : Wie funktionieren Tastatureingabe und Textausgabe?

Es scheint, als ob ein Großteil der Magie im Verzeichnis / dev / input passiert. Ich beschloss, mir mein eigenes Betriebssystem (Ubuntu 16.10) anzuschauen, um herauszufinden, was ich herausfinden konnte. Alle diese Dateien werden als 0 Bytes aufgelistet, und wenn ich das tue, sudo cat mouse0 | hexdump -Cbekomme ich eine Menge Hexdaten, die so aussehen:

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

Ich habe also ein paar Fragen:

  1. Was ist der Zweck dieser Datei? Es scheint mir, dass diese Gerätedateien nur als Zwischenhändler verwendet werden, um den Scancode vom Kernel auf den X-Server zu übertragen. Warum senden Sie es nicht einfach direkt vom Kernel an den X-Server?

  2. Warum gibt es so viele? Ich habe etwas mehr als 20 einzelne Ereignisdateien, aber nur eine Tastatur und eine Maus.

Astrum
quelle

Antworten:

17

Ich werde mit der Frage in umgekehrter Reihenfolge gehen:

  1. Warum gibt es so viele?

Dies sind Geräte, die für die meisten Eingaben auf einer Maschine stehen (es gibt andere, in denen beispielsweise ein Mikrofon nicht verwaltet wird /dev/input). Entgegen der Annahme, dass eine Tastatur plus eine Maus 2 Geräte ergeben würde, würden selbst die einfachste Tastatur und die einfachste Maus noch 6 davon ergeben.

Warum 6? Weil Xorg beim Start eine Testeingabetastatur und eine Testeingabemaus (beide virtuell) erstellt. Außerdem wird die Testtastatur mit der tatsächlichen Tastatur zu einem virtuellen Hauptgerät zusammengefasst. dh es wird ein Muxen des Eingangs durchgeführt. Das gleiche passiert mit dem Test und der tatsächlichen Maus.

Außerdem verfügt ein typischer Computer (Desktop oder Laptop) neben der Tastatur über weitere Tasten: Ein- / Aus-Taste, Sleep-Taste.

Die eventNGeräte dort sind Geräte für die Dinge, die Xorg erstellt, und für das, was der Computer hat. Das Nkommt von sequentiellen IDs und ist analog zu den IDs in xinput. Zum Beispiel auf meinem Computer habe ich:

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

Und xinputgibt mir analoge IDs:

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

(Schauen Sie, das eventNentspricht id=N)

Ohne Xorg

1.1 Was ist der Zweck dieser Datei?

Beachten Sie, dass alle zufälligen Eingaben (einschließlich meiner USB-Kamera!) Von Xorg als Teil der virtuellen Tastatur gesehen werden. Dies ermöglicht das Muxen und Demuxen von Eingaben. Zum Beispiel kann ich meine Maus über meine USB-Maus oder mein Trackpad bewegen, und eine Anwendung muss den Unterschied nicht kennen.

(Die Tatsache, dass die USB-Kamera Teil der virtuellen Tastatur ist, liegt daran, dass sie über eine Taste zum Ein- und Ausschalten verfügt. Da es sich um eine Taste handelt, wird sie Teil des Tastatursubsystems. Die eigentliche Videoeingabe wird verarbeitet /sys/class/video4linux. )

Mit anderen Worten, für eine Anwendung gibt es wirklich nur eine Tastatur und nur eine Maus. Aber sowohl Xorg als auch der Kernel müssen die Unterschiede kennen. Und das führt zum letzten Teil:

1.2 Warum nicht einfach direkt vom Kernel an den X-Server senden?

Weil Xorg den Unterschied kennen muss.

Und es gibt Situationen, in denen es nützlich ist. Sie können die Schlüssel in Xorg jedem Slave-Eingabegerät unterschiedlich zuordnen. Zum Beispiel habe ich ein Spielset mit Pedalen, wenn es in einem Rennspiel verwendet wird, das es ausgibt a, bund cfür jedes seiner Pedale. Doch bei der Programmierung ich diese Tasten neu zuordnen zu Esc, Ctrlund Alt, ohne die Tasten - Remapping auf der Tastatur selbst.

Es ist auch nicht erforderlich, dass auf einem Computer Xorg ausgeführt wird. Auf einem Headless-Server kann ich beispielsweise die folgende Ausgabe erhalten:

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

Wo die Eingabegeräte seriellen Schnittstellen entsprechen (insbesondere in diesem Fall) anstelle von Tastatur oder Maus.

gro♀
quelle
3
Die Kameraunterstützung selbst (wie beim Abrufen von Videos) erfolgt nicht über das Eingabesubsystem, sondern über V4L2. Kameras sind Tastatureingabegeräte, weil sie manchmal Tasten haben und diese wie Tasten wirken ...
Stephen Kitt
@ StephenKitt - Wow, ja. Ich habe mich nie in das Kamera-Subsystem eingemischt, aber jetzt kann ich / sys / class / video4linux sehen. Dort gibt es einige interessante Schnittstellen. Danke für die Information! (Ich habe die Antwort aktualisiert und den irreführenden Teil entfernt).
Gro♀
Xorg erstellt keine Gerätedateien: Es ist kein Treiber. Es öffnet sie stattdessen und führt die E / A durch sie aus. Es wird wirklich offensichtlich, wenn Sie die Maschine überhaupt ohne X starten und diese Geräte trotzdem sehen (und z gpm. B. laufen können ).
Ruslan
@ Ruslan, warum brauche ich einen Treiber, um Gerätedateien zu erstellen? Ich kann ein Blockgerät zum Beispiel mit einer Loop-Halterung erstellen. Geräte wären ohne X immer noch in Ordnung, die tatsächlichen Gerätedateien (auf modernen Kerneln) jedoch nicht. X wird udev in Ordnung verwenden, aber die udev-Regeln für eine Maus werden zum Beispiel nicht ausgeführt, wenn ohne X
gebootet wird.
Ich habe gerade Ubuntu 18.04 Live ausgeführt, ohne X überhaupt zu starten. Ich kann diese Dateien immer noch sehen. Nochmals: Die Maus kann ohne X arbeiten, siehe z. B. den gpmDaemon oder GTK2 im Framebuffer.
Ruslan
2

Es gibt kein "direkt senden". Anwendungen müssen über eine Methode zum Lesen der Daten verfügen. Unter Unix erfolgt dies auf dieselbe Weise wie beim Lesen normaler Dateien, indem ein Geräteknoten erstellt wird, der mit den normalen Datei-E / A-Systemaufrufen funktioniert, damit Anwendungen sie öffnen und lesen können.

Neben Maus und Tastatur gibt es noch andere Eingabequellen. Sie können herausfinden, was jeder ist, indem Sie hineinschauen /sys/class/input. Dort werden Dateien mit denselben inputNN-Namen bestraft, die symbolische Links zu einem anderen Knoten in sysfs sind, der das Gerät beschreibt, das sie darstellen. Andere häufig verwendete Quellen sind Soundkarten (die signalisieren, wenn Dinge ein- und ausgesteckt sind) und der physische Netzschalter am Computer.

psusi
quelle