ハードウェアがオペレーティングシステムとどのようにやり取りするのか疑問に思い、次の記事を見つけました。キーボード入力とテキスト出力はどのように機能しますか?
/dev/input ディレクトリで多くの魔法が起こっているようです。私は私のオペレーティングシステム(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つだけです。
答え1
この質問に逆順で答えます。
- なぜそんなにたくさんあるのですか?
これらのデバイスは、システム内のほとんどの入力を表します。で管理されていないマイクなどの他のデバイスもあります/dev/input
。 1つのキーボードと1つのマウスを組み合わせると、デバイスが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この文書の目的は何ですか?
すべてのランダム入力(私のUSBカメラを含む!)はXorgの仮想キーボードの一部として扱われます。これにより、入力の多重化と逆多重化が可能になります。たとえば、USBマウスまたはトラックパッドを介してマウスを動かすことができ、アプリケーションはその違いを知る必要はありません。
(実際のUSBカメラは、オンとオフを切り替えることができるボタンがあるため、仮想キーボードの一部です。ボタンはキーボードサブシステムの一部になります。実際のビデオ入力はで処理されます。/sys/class/video4linux
)
つまり、アプリケーションには実際には1つのキーボードと1つのマウスしかありません。ただし、Xorgとカーネルの両方がこれらの違いを知る必要があります。最後の部分につながります。
1.2 カーネルからXサーバに直接送ってはならないのはなぜですか?
Xorgは違いを知る必要があるからです。
状況によっては便利です。 Xorgのキーを各スレーブ入力デバイスに異なる方法で再マッピングできます。たとえば、レーシングゲームに使用されるときに各ペダルに出力とa出力bを提供するペダルを備えたゲーム機器があります。cただし、プログラミング時にキーボード自体のキーを再マップせずに、このキーをEsc, , に再マップします。CtrlAlt
また、システムが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
入力デバイスは、キーボードやマウスではなくシリアルポート(特にこの場合)に対応します。
答え2
「ダイレクト送信」のようなものはありません。アプリケーションにはデータを読み取る方法が必要です。 Unixでは、これは通常のファイルを読むのと同じです。つまり、アプリケーションがファイルを開いて読み取ることができるように、通常のファイルIOシステムコールで動作するデバイスノードを作成します。
マウスとキーボードに加えて、異なる入力ソースがあります。各項目を見ると何がわかります/sys/class/input
。ここでは、同じ inputNN 名でファイルを具体化します。これは、そのファイルが表すデバイスを記述するsysfsの他のノードへのシンボリックリンクです。他の一般的なソースには、サウンドカード(プラグを差し込んだり抜いたりするときに信号を送る)とコンピュータの物理電源ボタンがあります。