/ dev / input-これは正確には何ですか?


12

ハードウェアとOSの相互作用に興味があり、この投稿に出くわしました。キーボード入力とテキスト出力はどのように機能しますか?

多くの魔法が/ dev / inputディレクトリで起こっているようです。私は自分のOS(Ubuntu 16.10)を調べて、何がわかるかを確認することにしました。これらのファイルはすべて0バイトとしてリストされています。sudo cat mouse0 | hexdump -Cそうすると、次のような大量のhexdata が表示されます。

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個を超える個別のイベントファイルがありますが、キーボードとマウスは1つしかありません。

回答:


17

質問は逆の順序で行います。

  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カメラが仮想キーボードの一部であるのは、オンとオフを切り替えるボタンがあるためです。また、aはボタンなので、キーボードサブシステムの一部になります。実際のビデオ入力はで処理され/sys/class/video4linuxます。 )

つまり、アプリケーションの場合、実際にはキーボードとマウスは1つだけです。しかし、Xorgとカーネルの両方が違いを知る必要があります。そして、これは最後の部分につながります:

1.2カーネルからXサーバーに直接送信しないのはなぜですか?

Xorgは違いを知る必要があるからです。

そして、それが役立つ状況があります。Xorgのキーを各スレーブ入力デバイスに別々に再マッピングできます。例えば、私はそれが出力レースゲームで使用する場合、ペダルとのゲームセットを持っているabそしてcそのペダルのそれぞれについて。しかし、私はこれらのキーを再マッピングプログラミングするとき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を見ることができます。そこには興味深いインターフェースがいくつかあります。情報をありがとう!(私はasnwerを更新し、誤解を招く部分を削除しました)。
Grochmal

Xorgはデバイスファイルを作成しません。これはドライバーではありません。代わりにそれらを開き、それらを介してIOを実行します。Xをまったく使わずにマシンを起動しても、これらのデバイスが表示されている(そしてを実行できるなどgpm)と、明らかになります。
ルスラン

@Ruslanデバイスファイルを作成するためにドライバーが必要なのはなぜですか?たとえば、ループマウントを使用してブロックデバイスを作成できます。デバイスはXがなくても問題なく存在しますが、(最新のカーネルの)実際のデバイスファイルは存在しません。Xは、udevの無事を使用しますが、X.せずに起動する場合は例えばマウス用のudevルールは実行されません
grochmal

Xをまったく起動せずにUbuntu 18.04 Liveを実行しました。これらのファイルは引き続き表示されます。もう一度:マウスはXがなくても機能します。たとえば、gpmデーモン、またはフレームバッファ上のGTK2を参照してください。
ルスラン

2

「直接送る」というものはありません。アプリケーションには、データを読み取る何らかの方法が必要です。UNIXでは、通常のファイルIOシステムコールで動作するデバイスノードを作成して、通常のファイルを読み取るのと同じ方法で、アプリケーションがデータを開いて読み取ることができるようにします。

マウスとキーボード以外にも、他の入力ソースがあります。を調べると、それぞれが何であるかがわかります/sys/class/input。そこでは、それらが表すデバイスを記述するsysfs内の別のノードへのシンボリックリンクである同じinputNN名を持つファイルを細かくします。他の一般的なソースには、サウンドカード(プラグが差し込まれたときと抜かれたときに信号を送る)とコンピューターの物理的な電源ボタンがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.