GNU/Linux >> Linux の 問題 >  >> Linux

キーボード入力とテキスト出力はどのように機能しますか?

Aを押したとします テキストエディタでキーを押すと、文字aが挿入されます ドキュメントに表示され、画面に表示されます。エディターアプリケーションがハードウェアと直接通信していないことを知っているので(カーネルなどが間にあります)、コンピューター内で何が起こっているのでしょうか?

承認された回答:

いくつかの異なるシナリオがあります。最も一般的なものについて説明します。連続する巨視的イベントは次のとおりです。

  1. 入力:キー押下イベントがキーボードハードウェアからアプリケーションに送信されます。
  2. 処理:キーが A であるため、アプリケーションはそれを決定します が押された場合、文字aを表示する必要があります 。
  3. 出力:アプリケーションは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などの名前です。 、aacuteF1KP_AddControl_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=

Linux
  1. Linuxで出力をファイルとStdoutにリダイレクトする方法

  2. Ssh –すべての入力と出力がリダイレクトされたときにSshはどのようにパスワードを要求しますか?

  3. パテにコピーアンドペーストする方法

  1. DNSとは何ですか?どのように機能しますか?

  2. tr コマンドの「-s」、「-t」、および「-c」オプションは Unix でどのように機能しますか?

  3. Linux で入出力エラーを解釈して修正する方法は?

  1. Makefileとは何ですか?どのように機能しますか?

  2. Webサーバーとは何ですか?Webサーバーはどのように機能しますか?

  3. ターミナルの入力と出力をテキストファイルに取得する方法は??