Aを押したとします テキストエディタでキーを押すと、文字a
が挿入されます ドキュメントに表示され、画面に表示されます。エディターアプリケーションがハードウェアと直接通信していないことを知っているので(カーネルなどが間にあります)、コンピューター内で何が起こっているのでしょうか?
承認された回答:
いくつかの異なるシナリオがあります。最も一般的なものについて説明します。連続する巨視的イベントは次のとおりです。
- 入力:キー押下イベントがキーボードハードウェアからアプリケーションに送信されます。
- 処理:キーが A であるため、アプリケーションはそれを決定します が押された場合、文字
a
を表示する必要があります 。 - 出力:アプリケーションは
a
を表示するように命令します 画面に表示されます。
GUIアプリケーション
UNIXシステムのデファクトスタンダードのグラフィカルユーザーインターフェイスはXWindowSystemであり、アプリケーションとディスプレイサーバー間のコアプロトコルの11番目のバージョンで安定したため、X11と呼ばれることがよくあります。 Xサーバーと呼ばれるプログラムは、オペレーティングシステムのカーネルとアプリケーションの間にあります。画面にウィンドウを表示したり、フォーカスのあるウィンドウにキーを押したりするなどのサービスを提供します。
入力
+----------+ +-------------+ +-----+
| keyboard |------------->| motherboard |-------->| CPU |
+----------+ +-------------+ +-----+
USB, PS/2, … PCI, …
key down/up
まず、キーの押下とリリースに関する情報がキーボードからコンピューターに送信され、コンピューターの内部に送信されます。詳細はハードウェアの種類によって異なります。チェーンのこの部分全体で情報が同じであるため、この部分についてはこれ以上詳しく説明しません。特定のキーが押されたか、離されました。
+--------+ +----------+ +-------------+
-------->| kernel |------->| X server |--------->| application |
+--------+ +----------+ +-------------+
interrupt scancode keysym
=keycode +modifiers
ハードウェアイベントが発生すると、CPUが割り込みをトリガーし、カーネル内の一部のコードが実行されます。このコードは、ハードウェアイベントがキーボードからのキー押下またはキーリリースであることを検出し、スキャンコードを記録します キーを識別します。
Xサーバーは、デバイスファイル(/dev/input/eventNNN
など)を介して入力イベントを読み取ります。 Linuxの場合(NNNは数値です)。イベントが発生するたびに、カーネルはそのデバイスから読み取るデータがあることを通知します。デバイスファイルは、スキャンコードを使用してキーアップ/ダウンイベントを送信します。スキャンコードは、ハードウェアによって送信される値と同じ場合と同じでない場合があります(カーネルは、スキャンコードをキーボード依存の値から共通の値に変換する場合がありますが、Linuxはそうではありません。知らないスキャンコードを再送信しないでください。
Xは、キーコードを読み取るスキャンコードを呼び出します 。 Xサーバーは、キーコードを keysymsに変換するテーブルを維持します (「キーシンボル」の略)。キーコードは数値ですが、キー記号はA
などの名前です。 、aacute
、F1
、KP_Add
、Control_L
、…どの修飾キーが押されているかによってkeysymが異なる場合があります( Shift 、 Ctrl 、…)。
キーコードからkeysymsへのマッピングを構成するメカニズムは2つあります。
- xmodmapは従来のメカニズムです。これは、キーコードをキーシムのリスト(変更されていない、シフトされている、…)にマッピングする単純なテーブルです。
- XKBはより強力ですが、より複雑なメカニズムであり、特に2言語構成など、より多くの修飾子をより適切にサポートします。
アプリケーションはXサーバーに接続し、そのアプリケーションのウィンドウにフォーカスがあるときにキーが押されると通知を受け取ります。通知は、特定のkeysymが押されたか解放されたこと、および現在どの修飾子が押されているかを示します。プログラムxev
を実行すると、keysymsを確認できます。 ターミナルから。アプリケーションが情報をどのように処理するかは、それ次第です。一部のアプリケーションには、構成可能なキーバインディングがあります。
通常の構成では、 Aというラベルの付いたキーを押すと 修飾子がない場合、これはkeysym a
を送信します アプリケーションに;アプリケーションがテキストを入力しているモードの場合、これにより文字a
が挿入されます 。
キーボードレイアウトとxmodmapの関係については、キーボード入力について詳しく説明します。 Linuxでマウスイベントはどのように機能しますか?下位レベルでのマウス入力の概要を示します。
出力
+-------------+ +----------+ +-----+ +---------+
| application |------->| X server |---····-->| GPU |-------->| monitor |
+-------------+ +----------+ +-----+ +---------+
text or varies VGA, DVI,
image HDMI, …
文字を表示する方法は2つあります。
- サーバー側のレンダリング :アプリケーションは、Xサーバーに「この文字列をこのフォントでこの位置に描画する」ように指示します。フォントはXサーバーにあります。
- クライアント側のレンダリング :アプリケーションは、選択したフォントで文字を表す画像を作成し、Xサーバーにその画像を表示するように指示します。
さまざまな種類のXWindowsフォントの目的は何ですか?を参照してください。 X11でのクライアント側とサーバー側のテキストレンダリングについて説明します。
Xサーバーとグラフィックスプロセッシングユニット(ビデオカードのプロセッサ)の間で何が起こるかは、ハードウェアに大きく依存します。単純なシステムでは、Xサーバーがフレームバッファーと呼ばれるメモリ領域を描画します。フレームバッファーは、GPUが表示用に取得します。 21世紀のPCやスマートフォンに見られるような高度なシステムにより、GPUはパフォーマンスを向上させるためにいくつかの操作を直接実行できます。最終的に、GPUは画面コンテンツをピクセルごとに1秒ごとにモニターに送信します。
端末で実行されるテキストモードアプリケーション
テキストエディタが端末で実行されるテキストモードアプリケーションである場合、それは上記のセクションの目的のためのアプリケーションである端末です。このセクションでは、テキストモードアプリケーションと端末の間のインターフェイスについて説明します。最初に、X11で実行されているターミナルエミュレータの場合について説明します。 「ターミナル」、「シェル」、「tty」、「コンソール」の正確な違いは何ですか?ここで役立つ背景かもしれません。これを読んだ後、はるかに詳細なものを読みたいと思うかもしれません。各擬似端末(PTY)コンポーネント(ソフトウェア、マスター側、スレーブ側)の責任は何ですか?
入力
+-------------------+ +-------------+
----->| terminal emulator |-------------->| application |
+-------------------+ +-------------+
keysym character or
escape sequence
ターミナルエミュレータは、「Left
」などのイベントを受信します Shift
中に押された ダウンしていた」。ターミナルエミュレータとテキストモードアプリケーション間のインターフェイスは、疑似端末(pty)です。 、バイトを送信する文字デバイス。ターミナルエミュレータは、キー押下イベントを受信すると、これを1つ以上のバイトに変換し、アプリケーションがptyデバイスから読み取るようにします。
ASCII範囲外の印刷可能な文字は、文字とエンコーディングに応じて1バイト以上として送信されます。たとえば、Unicode文字セットのUTF-8エンコーディングでは、ASCII範囲の文字は1バイトとしてエンコードされ、その範囲外の文字は複数バイトとしてエンコードされます。
Ctrlなどの修飾子を使用したファンクションキーまたは印刷可能な文字に対応するキー押下 またはAlt エスケープシーケンスとして送信されます 。エスケープシーケンスは通常、文字エスケープで構成されます(バイト値27 =0x1B=