/ 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多个单独的事件文件,但只有一个键盘和鼠标。

Answers:


17

我将以相反的顺序回答这个问题:

  1. 为什么这么多?

这些是代表机器上大多数输入的设备(还有其他设备,例如,将不会在中管理麦克风/dev/input)。与一个键盘加一个鼠标可以提供2个设备的假设相反,即使最简单的键盘和最简单的鼠标也仍然可以提供6个设备。

为什么是6?因为Xorg在启动期间会创建一个测试输入键盘和一个测试输入鼠标(均为虚拟)。同样,它将把测试键盘和实际键盘聚合到一个主虚拟设备中。即它将执行输入的多路复用。测试鼠标和实际鼠标也会发生相同的情况。

另外,典型的计算机(台式机或笔记本电脑)除键盘外还具有其他按钮:电源按钮,睡眠按钮。

其中的eventN设备用于Xorg创建的东西以及计算机所拥有的设备。在N来自顺序ID和类似于在的ID 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给我类似的ID:

[~]$ 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该文件的目的是什么?

请注意,Xorg将所有随机输入(包括我的USB摄像头!)视为虚拟键盘的一部分。这允许输入的混合和解复用。例如,我可以通过USB鼠标或触控板移动鼠标,而应用程序不需要知道它们之间的区别。

(USB摄像头是虚拟键盘的一部分,这是因为它具有用于打开和关闭它的按钮。由于a是按钮,因此它成为键盘子系统的一部分。实际的视频输入在中处理/sys/class/video4linux。 )

换句话说,对于一个应用程序来说,实际上只有一个键盘和只有一个鼠标。但是Xorg和内核都需要知道它们之间的差异。这导致了最后一部分:

1.2为什么不直接将其从内核发送到X服务器?

因为Xorg需要知道区别。

在某些情况下它很有用。您可以将Xorg中的键重新映射到每个从属输入设备。例如,我有一个带踏板的游戏机,在赛车游戏中使用时,会输出abc为其每个踏板输出。然而,编程时我重新映射这些键EscCtrl并且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

输入设备对应于串行端口(在这种情况下,它们对应)而不是键盘或鼠标。


3
摄像机支持本身(例如,检索视频)不会通过输入子系统,而是通过V4L2。相机是键盘输入设备,因为它们有时具有按钮,而按钮的作用类似于键...
Stephen Kitt

@StephenKitt-哇,是的。我从不干预相机子系统,但现在可以看到/ sys / class / video4linux。那里有一些有趣的界面。谢谢(你的)信息!(我已经更新了升级程序,并删除了误导部分)。
grochmal

Xorg不会创建设备文件:它不是驱动程序。相反,它将打开它们并通过它们进行IO。当您完全不使用X启动机器并仍然看到这些设备(并且可以运行gpm)时,这变得非常明显。
罗斯兰

@Ruslan为什么需要驱动程序来创建设备文件?例如,我可以使用循环安装来创建块设备。如果没有X,设备仍然可以存在,但是(在现代内核上)实际的设备文件就不会。X将使用udev,但是如果不使用X进行引导,则不会执行例如鼠标的udev规则
。– grochmal

我刚刚运行Ubuntu 18.04 Live,根本没有启动X。我仍然可以看到这些文件。再一次:鼠标可以在没有X的情况下工作,例如参见gpm守护程序或帧缓冲区上的GTK2。
罗斯兰

2

没有“直接发送”这样的东西。应用程序必须具有某种读取数据的方法,并且在Unix中,通过创建与普通文件IO系统调用一起使用的设备节点来允许应用程序打开和读取它们,以与读取常规文件相同的方式进行操作。

除鼠标和键盘外,还有其他输入源。通过查看,您可以找出每个人的含义/sys/class/input。在那里,您将使用具有相同inputNN名称的文件细化文件,这些文件是指向sysfs中另一个节点的符号链接,该节点描述了它们所代表的设备。其他常见来源包括声卡(在插入和拔出物品时发出信号)和计算机上的物理电源按钮。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.