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

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

仮想端末デバイス (例: ) はわかりませんが、を押せば/dev/tty1に「切り替える」ことができることは知っています。tty1ctrl + alt + f1

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

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

Linux カーネルはキーボードの入力/出力をどのように処理しますか? すべてのスキャンコード/キーコード/キーシムなどのリスト、および Linux が「キーボード」という概念全体を管理する方法の全体的なロジックが記載されたソース ファイルはありますか?

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

答え1

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

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

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

これらの翻訳を実装したソースコードを見たい場合は、キーボードドライバーそして汎用入力コード、 そしてユーデブそしてlibudev

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

関連情報