答え1
入力レイヤーの簡単な概要:
キーボード デバイスは、USB や PS/2 ポートなど、何らかの方法で PC に接続されています。このメカニズムのカーネル ドライバーは、キーボードのキーが押されたときに通信を処理する方法を知っています。
USBキーボードの場合、隠蔽(ヒューマンインターフェースデバイス)が存在します。これはキーボードだけでなく、マウス、ジョイスティック、その他の入力デバイスにも適用されます。そのため、デバイスにはディスクリプタカーネルにどのようなシグナルを発することができるかを伝え、キーのコードの多くはミュート標準化されています。
ただし、一部のキーボードには標準化されていないキーがあり (Fn一部のキーボードの など)、それらのキーにどのような信号を送るかはメーカー次第です。
カーネルには、HID デバイスを処理するための特別なレイヤーがあります。このレイヤーは、生の HID 通信を で利用できるように/dev/hidrawX
し、HID イベントをカーネル入力イベントに変換します。
カーネル入力層はスキャンコード(デバイス固有の物理キーに対応する番号)に変換し、キーコード(すべてのデバイスで標準化された論理キーに対応する番号)。どちらも のイベントとして使用できます。これらのイベントを表示するには を使用し、変換テーブルを表示するには などを/dev/input/eventX
使用します。evdev
showkey
dumpkeys
Xサーバー(またはWayland)はこれらすべてのイベントを読み取り、キーシンボル( などa
、á
または のような特殊なものAudioMute
)。X アプリケーションはこのシンボルを受け取り、それに応じて動作します。see xev
application を使用してこのレイヤーを確認し、の仕様xmodmap
とを使用して設定することができます。xkbd
xorg.conf
に反応するにはAudioMute
、何らかのアプリケーションが必要です。多くの場合、これはウィンドウ マネージャーですが、ウィンドウ マネージャーが対応していない場合は、別のアプリケーションでも動作します。
したがって、単一の「キーボード ドライバー」は存在せず、はるかに複雑であり、「ミュート」を特別に呼び出す必要はありません。
答え2
一般的な理解では、あなたの言う通りです。キーを押すと、キーボードはスキャンコード、つまり各キーを識別する一連の数字を送信します。スキャンコードはキーコードにマッピングされます。各キーコードは、特定のキーが押されたときにプログラムがどのように反応するかを定義する関数に対応します。Xorg とコンソールは異なるキーコード セットを使用することに注意してください。Wayland についてはあまり詳しくありませんが、独自のキーコード セットを使用しているのかもしれません。キーコードはキー シンボルにマッピングされます。キー シンボルを使用すると、開発者はより抽象度の高いレベルでキーボードを操作できます。
showkey --scancode
と をそれぞれ実行すると、コンソール上でスキャンコードとキーコードを確認できますshowkey --keycode
。Xorg では、xev
後者に を使用する必要があります。
これらの抽象化レベルにより、Linux環境のさまざまな部分に影響を与える柔軟で複雑なマッピングスキームを作成できます。ArchWikiの記事マッピング技術に関する多くの情報が含まれているので、詳細を知りたい場合は読んでみてください。
他にもたくさんあります記事インターネットには、キーボードが低レベルでどのように動作するかを説明する記事がたくさんあります。記事が 1999 年に書かれたか 2010 年に書かれたかは問題ではありません。その頃からキーボードにはあまり変化がありませんが、USB HID デバイスは「従来の」PS/2 キーボードとは異なる動作をすることを覚えておいてください。