web-dev-qa-db-ja.com

Linuxカーネルはキーボードの入出力をどのように処理しますか?

仮想端末デバイス(/dev/tty1など)は理解できませんが、tty1を押すとctrl + alt + f1に「切り替える」ことができます。

/usr/share/X11/xkb/symbols/usにあるカスタムキーボードレイアウトを持っていますが、Xが実行されている場合にのみ機能します。

仮想端末とXはどちらも独自の方法でキーボードの入出力を管理しているようですが、おそらくどちらも(Linux)カーネルと何らかの方法でインターフェイスします。これにより、キーボードハードウェアに何らかの抽象化を提供する必要があります。

Linuxカーネルはキーボードの入出力をどのように処理しますか?すべてのscancodes/keycodes/keysims/etc。のリスト、およびおそらくLinuxが「キーボード」の概念全体をどのように管理するかという全体的なロジックで確認できるソースファイルはありますか?

(私はLubuntuを実行しています。)

6

トピックの概要については、 キーボード入力とテキスト出力はどのように機能しますか? を参照してください。

より詳細には、Linuxでは、カーネルはハードウェアからスキャンコードを受け取り、それらをキーコードに変換します。 (この用語は完全に標準ではありません。両方に「スキャンコード」または「キーコード」が使用されている場合があります。)この変換がどのように機能するかは、キーボードドライバーによって異なります。 PS/2キーボードの場合、 setkeycodes で構成できます。 USBキーボードの場合、それを via udev で設定できます。 The Arch wiki も参照してください。キーボードやマウスを含むすべてのユーザー入力デバイスは、イベントデバイス/dev/input/event*を介して公開されます。

Linuxコンソールでは、コンソールのキーマップに従ってキーコードがエスケープシーケンスにマッピングされます。コンソールはテキスト端末であるため、アプリケーションはバイトを表示し、印刷可能な文字はそれ自体を表し、ファンクションキーは制御文字またはエスケープシーケンスを使用してエンコードされます。 loadkeys でマッピングを変更できます。マッピングでは、キーコード+修飾子の組み合わせ(3つの修飾子:shiftcontrolalt)からkeysymへ、およびkeysymから文字列(文字またはエスケープ)への2レベルの間接指定を使用します。シーケンス)。キーシムのセットは固定されているため、カスタムの組み合わせを定義する場合は、F13F14、…など、他の方法では使用されない既存のキーシムを使用する必要があります。

これらの変換を実装するソースコードを確認する場合は、 keyboard drivers および generic input code を参照してください。 、および udev および libudev

X11(GUI)には、アプリケーションが受け取るものにキーコードをマップする独自の方法があります。 X11アプリケーションはキーシムと修飾子を認識するため、ファンクションキーをさらにエンコードする必要はありません。 Xでキーマップを定義するには、実際には2つの方法があります。1つは従来の方法であるxmodmapで、もう1つはより強力で複雑な新しいメカニズムXKBです。