ハードウェアとOSの相互作用に興味があり、この投稿に出くわしました キーボード入力とテキスト出力はどのように機能しますか?
多くの魔法が/ dev/inputディレクトリで起こっているようです。私は自分のOS(Ubuntu 16.10)を調べて、何がわかるかを確認することにしました。これらのファイルはすべて0バイトとしてリストされており、Sudo cat mouse0 | hexdump -C
を実行すると、次のような大量の16進データが表示されます。
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..............|
だから私はいくつかの質問があります:
このファイルの目的は何ですか?これらのデバイスファイルは、カーネルからXサーバーにスキャンコードを転送する仲介者としてのみ使用されているようです。カーネルからXサーバーに直接送信しないのはなぜですか?
なぜそんなにたくさんあるのですか? 20個を超える個別のイベントファイルがありますが、キーボードとマウスは1つだけです。
質問は逆の順序で行います。
- なぜそんなにたくさんあるのですか?
これらは、マシンに存在するほとんどの入力を表すデバイスです(他にもあります。たとえば、マイクは/dev/input
で管理されません)。 1つのキーボードと1つのマウスで2つのデバイスが提供されるという想定とは逆に、最も単純なキーボードとマウスでも、6つのデバイスが提供されます。
なぜ6? Xorgは起動時にテスト入力キーボードとテスト入力マウス(両方とも仮想)を作成するためです。また、テストキーボードと実際のキーボードをメインの仮想デバイスに集約します。つまり、入力の多重化を実行します。同じことがテストと実際のマウスに起こります。
さらに、一般的なコンピューター(デスクトップまたはラップトップ)には、キーボード以外に電源ボタン、スリープボタンなどのボタンがあります。
そこにあるeventN
デバイスには、Xorgが作成したものとコンピューターが持っているもののためのデバイスがあります。 N
はシーケンシャルIDから取得され、xinput
のIDに類似しています。たとえば、私のマシンでは:
[~]# 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このファイルの目的は何ですか?
すべてのランダム入力(USBカメラを含む!)は仮想キーボードの一部としてXorgに表示されることに注意してください。これにより、入力の多重化と逆多重化が可能になります。たとえば、USBマウスまたはトラックパッドを使用してマウスを移動できますが、アプリケーションが違いを認識する必要はありません。
(USBカメラが仮想キーボードの一部であるのは、オンとオフを切り替えるボタンがあるためです。そして、aはボタンなので、キーボードサブシステムの一部になります。実際のビデオ入力は、/sys/class/video4linux
で処理されます。)
つまり、アプリケーションの場合、実際にはキーボードとマウスは1つだけです。しかし、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
入力デバイスがキーボードやマウスではなくシリアルポート(この場合は特にそうです)に対応する場合。
「直接送る」というものはありません。アプリケーションにはデータを読み取るためのいくつかの方法が必要です。UNIXでは、通常のファイルを操作するデバイスノードを作成することで通常のファイルを読み取るのと同じ方法で実行されますIOシステムコールでアプリケーションに開いて読んでください。
マウスとキーボード以外にも、他の入力ソースがあります。 /sys/class/input
を見ると、それぞれが何であるかがわかります。そこでは、それらが表すデバイスを記述するsysfs内の別のノードへのシンボリックリンクである同じinputNN名を持つファイルを細かくします。他の一般的なソースには、サウンドカード(プラグが差し込まれたり抜かれたときに信号を送る)やコンピューターの物理的な電源ボタンなどがあります。