ターミナルエミュレーター(たとえばxterm
)を開くと、xterm
にはマスターエンド(/dev/ptmx
)とスレーブエンド(/dev/pts/#
)があります。
しかし、(Ctrl+Alt+F#
を押して)仮想端末を開くと、仮想端末もマスターに接続されますか?または、マスターなしでスレーブ(/dev/tty#
)に直接接続されていますか?
マスターはありません(したがって、スレーブでもありません)。
xterm
を使用している場合、xterm
プロセスは、一方の端でキー押下とピクセル間を変換し、もう一方の端でシリアルポートのバイトストリームをエミュレートします。カーネルは、ptyマスターを介してxterm
との間でデータを中継します。
tty1
を使用している場合、カーネルはそれ自体ですべてのことを実行します。 drivers/tty/vt/keyboard.c
のコードはキー押下を解釈し、drivers/tty/vt/vt.c
は出力を解釈します。 VT100のような動作を実装するためのxterm
のすべてのロジックがそこに複製されます。
この実装はカーネル内にあるため、ユーザースペースプロセスを介して中継することなく、関連する下位レベルのドライバー(GPU、キーボードがあるUSBバスなど)と直接通信できます。別のユーザースペースプロセスが関与していなければ、ttyの「マスターエンド」は必要ありません。
その時点で、セマンティクスに興味があるので、「はい、マスターがあります」と「いいえ、マスターがありません」の両方が正しいです。
はい、マスターがあります。コンソールドライバー自体です。スレーブ側が認識して送信する文字コードは、キーボードで実際に何が起こっているかとはほとんど関係がないか、まったく関係がありません。実際のハードウェアは、80年代半ばのハードウェアのような錯覚を与えるために、リダイレクト、再解釈、および再レンダリングの多くのレイヤーを経ています。
いいえ、マスターはありません。マスターはスレーブ側が見るものをプログラムで制御できます。カーネルの関連部分を文字通り置き換えることなく、それを行うことはできません。ロードキーを実行してキーストロークの解釈方法を制御できますが、通常のプログラムはそれ自体をデータフローに挿入できません。
用語に注意してください。ここで端末を「仮想」と呼ぶには、2つの異なる方法があります。
ターミナルエミュレータは仮想端末を作成しますが、通常は「仮想端末」とは呼ばれませんが、疑似端末です。ターミナルエミュレータは/dev/ptmx
を開き、ターミナルのターミナルインターフェイス(「マスターエンド」と呼ばれます)を取得します。ターミナルで実行されているアプリケーションは、/dev/pts
(「スレーブエンド」と呼ばれます)にあるターミナルのアプリケーションインターフェイスを使用します。
Linuxが「仮想端末」(vt)と呼ぶものは、コンソールとも呼ばれます。同じキーボードと画面を共有する複数のvtがあるため、仮想です。ここでは、アプリケーション側のデバイスが1つしかないため、マスターデバイスとスレーブデバイスの概念はありません。ターミナル側はカーネルによって内部的に処理されます(マスターエンドはカーネル内に隠されていると言えます)。