Aテキストエディタで対応するキーを押すと、文書に文字が挿入され、画面a
に表示されます。私はエディタアプリケーションがハードウェアと直接通信しないことを知っています(その間にカーネルと他のものがあります)。それでは、私のコンピュータ内部では何が起こっているのでしょうか?
ベストアンサー1
いくつかのシナリオがあります。最も一般的なシナリオを説明します。連続マクロイベントは次のとおりです。
- 入力:キーイベントがキーボードハードウェアからアプリケーションに送信されます。
- 処置:アプリケーションはAキーを押したため、文字を表示する必要があると判断します
a
。 a
出力:アプリケーションは画面に表示されるコマンドを提供します。
GUIアプリケーション
UNIXシステムの事実上、標準のグラフィカルユーザーインターフェースは次のとおりです。Xウィンドウシステム、アプリケーションとディスプレイサーバー間のコアプロトコルバージョン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 サーバーは、キー入力コードを次に変換するテーブルを維持します。主なシンボル(「キー記号」の略語)。キーコードは数字で、キー記号は名前です(たとえば、、、、、A
… )。キー記号は、どの修飾子キーを押すか(、、、…)によって異なります。aacute
F1
KP_Add
Control_L
ShiftCtrl
キーコードからキーシンボルへのマッピングを構成するメカニズムには2つの方法があります。
- xmodmap伝統的なメカニズムです。これは、キーコードをキーシンボルのリスト(変更されていない、移動されたなど)にマッピングする簡単なテーブルです。
- XKBより多くの修飾子、特にバイリンガル構成などをよりよくサポートできる、より強力であるがより複雑なメカニズムです。
アプリケーションはXサーバーに接続し、アプリケーションウィンドウにフォーカスがある間にキーを押すと通知を受け取ります。この通知は、キー記号が押されているか放されたか、現在どの修飾子が押されているかを示します。プログラムを実行すると、主要な記号が表示されます。xev
ターミナルから。アプリケーションがこの情報を処理する方法はアプリケーションによって異なります。一部のアプリケーションには設定可能なキーバインディングがあります。
一般的な構成では、修飾子の表示がないキーを押すと、Aキーシンボルがa
アプリケーションに送信されます。アプリケーションがテキスト入力モードの場合、文字が挿入されますa
。
キーボードレイアウトとxmodmapの関係キーボード入力について詳しく説明します。Linuxでは、マウスイベントはどのように機能しますか?低レベルマウス入力の概要
出力
+-------------+ +----------+ +-----+ +---------+
| application |------->| X server |---····-->| GPU |-------->| monitor |
+-------------+ +----------+ +-----+ +---------+
text or varies VGA, DVI,
image HDMI, …
文字を表示する方法は2つあります。
- サーバーサイドレンダリング:アプリケーションはXサーバーに "この場所にこのフォントでこの文字列を描画します。」。フォントはXサーバーにあります。
- クライアントレンダリング:アプリケーションは、選択したフォントで文字を表す画像を作成し、Xサーバーに画像を表示するように指示する。
バラよりXWindowsフォントのさまざまな種類は何に使用されますか?X11におけるクライアント側とサーバ側のテキストレンダリングに関する議論
XサーバーとXサーバーの間に何が起こりますか?グラフィックス処理装置(グラフィックカードのプロセッサ)はハードウェアに大きく依存します。単純なシステムでは、Xサーバーフレームバッファ、GPUによって選択され表示されます。 21世紀のPCまたはスマートフォンの高度なシステムにより、GPUはより良いパフォーマンスを得るためにいくつかのタスクを直接実行できます。最終的に、GPUは画面コンテンツを毎秒ピクセル単位でディスプレイに送信します。
テキストモードアプリケーション、端末で実行
テキストエディタが端末で実行されるテキストモードアプリケーションの場合、その端末は前のショーで使用されたアプリケーションです。このセクションでは、テキストモードアプリケーションと端末間のインタフェースについて説明します。まず、ケースを説明します。端末エミュレータX11で実行されます。「ターミナル」、「シェル」、「tty」、「コンソール」の正確な違いは何ですか?ここで役に立つ背景があるかもしれません。この記事を読んだ後、さらに詳しく読むことができます。各PTY(擬似端末)コンポーネント(ソフトウェア、マスター側、スレーブ側)の役割は何ですか?
入力する
+-------------------+ +-------------+
----->| terminal emulator |-------------->| application |
+-------------------+ +-------------+
keysym character or
escape sequence
端末エミュレータは、「押したLeft
ときに押す」Shift
などのイベントを受け取ります。ターミナルエミュレータとテキストモードアプリケーション間のインタフェースは次のとおりです。擬似端末(pty)、ㅏキャラクターデバイスバイトを転送します。ターミナルエミュレータは、キー押下イベントを受信すると、それをアプリケーションがptyデバイスから読み取る1つ以上のバイトに変換します。
ASCII 範囲外の印刷可能文字は、文字およびタイプに応じて 1 つ以上のバイトに送信されます。コーディング。例えば、UTF-8符号化Unicode文字セット、文字セットASCIIコード範囲はシングルバイトでエンコードされ、範囲外の文字はマルチバイトでエンコードされます。
CtrlAltファンクションキーに対応するキー入力などの修飾子を使用して印刷可能な文字エスケープシーケンス。エスケープシーケンスは通常文字で構成されます。脱出する(バイト値27 = 0x1B =、時にはまたは\033
で示される)の後に、1つ以上の印刷可能な文字が続きます。一部のキーまたはキーの組み合わせでは、^[
\e
制御文字ASCIIベースのエンコーディング(Unicodeを含む今日使用されているほとんどすべてのエンコーディング)に対応します。Ctrl+はletter1〜26の範囲の文字値を生成し、上記のエスケープ文字であり、Esc+と同じです。 +、+と同じなどCtrl[TabCtrlIReturnCtrlM
異なる端末は、所与のキーまたはキーの組み合わせに対して異なるエスケープシーケンスを送信する。幸いにも、その逆も同様です。シーケンスが与えられると、実際にエンコードするキーの組み合わせは最大1つです。 1つの例外は127 = 0x7f =文字で、頻繁に表示され\0177
ますが、時々Backspace表示されますDelete。
端末でCtrl+Vキーの組み合わせを入力すると、キーの組み合わせにあるエスケープシーケンスの最初のバイトが文字通り挿入されます。エスケープシーケンスには通常、最初の文字の後に印刷可能な文字のみが含まれるため、文字通りエスケープシーケンス全体が挿入されます。バラよりキーバインディングテーブル?この文脈でzshについて話し合う。
端末は、特定の修飾子の組み合わせに対して同じエスケープシーケンスを送信することができる。たとえば、多くの端末はおよびSpace+のShift空白文字を送信しますSpace。xterm には修飾子の組み合わせを区別するパターンがあります。しかし、広く使用されているvteライブラリに基づく端末は、)。修飾キーまたはターミナルエミュレータバインディング(コピーまたは貼り付けコマンドなど)をトリガーするキーなど、一部のキーはまったく送信されません。
アプリケーションは、必要に応じてエスケープシーケンスをシンボルキー名に変換できます。
出力
+-------------+ +-------------------+
| application |-------------->| terminal emulator |--->
+-------------+ +-------------------+
character or
escape sequence
出力は入力よりはるかに簡単です。アプリケーションが pty デバイスファイルに文字を出力すると、端末エミュレータは現在のカーソル位置に文字を表示します。 (ターミナルエミュレータはカーソル位置を維持し、カーソルが画面の下部に下がるとスクロールします。)アプリケーションはまた、エスケープシーケンス(ほとんどまたは^[
で始まる^]
)を出力してターミナルにカーソルを移動し、テキストプロパティを変更する(色、太字など)または画面の一部を消去します。
端末エミュレータでサポートされるエスケープシーケンスは次のとおりです。用語キャップまたは用語情報データベース。最近、ほとんどの端末エミュレータではxterm。バラよりLESS_TERMCAP_*変数のドキュメントはありますか?端末能力情報データベースのより長い議論、そしてカーソルの点滅を止める方法そして自分のローカルコンピュータの端末の色をSSH接続しているコンピュータの端末の色に設定できますか?いくつかの使用例。
テキストコンソールで実行されるアプリケーション
アプリケーションがテキストコンソール(つまり、ターミナルエミュレータアプリケーションではなくカーネルが提供するターミナル)で直接実行されても、同じ原則が適用されます。端末とアプリケーション間のインタフェースは、エスケープシーケンスでエンコードされた特殊キーとコマンドを含む送信文字のバイトストリームです。
ネットワーク経由でアクセスされるリモートアプリケーション
リモートテキストアプリケーション
たとえば、次のようにリモートコンピュータでプログラムを実行している場合SSH、ネットワーク通信プロトコルはptyレベルでデータを中継します。
+-------------+ +------+ +-----+ +----------+
| application |<--------->| sshd |<--------->| ssh |<--------->| terminal |
+-------------+ +------+ +-----+ +----------+
byte stream byte stream byte stream
(char/seq) over TCP/… (char/seq)
場合によっては、リモート端末データベースがローカル端末のすべての機能を知らない可能性があることを除いて、これはほとんど透明です。
リモートX11アプリケーション
アプリケーションとサーバー自体の間の通信プロトコルは、SSHなどのネットワークプロトコルを介して送信できるバイトストリームです。
+-------------+ +------+ +-----+ +----------+
| application |<---------->| sshd |<------>| ssh |<---------->| X server |
+-------------+ +------+ +-----+ +----------+
X11 protocol X11 over X11 protocol
TCP/…
アプリケーションとディスプレイ間の直接通信が必要な一部の加速機能(映画のデコードや3Dレンダリングなど)が利用できないことを除いて、これは一般的に透明です。