web-dev-qa-db-ja.com

仮想端末にはマスターエンドがありますか?

ターミナルエミュレーター(たとえばxterm)を開くと、xtermにはマスターエンド(/dev/ptmx)とスレーブエンド(/dev/pts/#)があります。

しかし、(Ctrl+Alt+F#を押して)仮想端末を開くと、仮想端末もマスターに接続されますか?または、マスターなしでスレーブ(/dev/tty#)に直接接続されていますか?

2
James

マスターはありません(したがって、スレーブでもありません)。

xtermを使用している場合、xtermプロセスは、一方の端でキー押下とピクセル間を変換し、もう一方の端でシリアルポートのバイトストリームをエミュレートします。カーネルは、ptyマスターを介してxtermとの間でデータを中継します。

tty1を使用している場合、カーネルはそれ自体ですべてのことを実行します。 drivers/tty/vt/keyboard.cのコードはキー押下を解釈し、drivers/tty/vt/vt.cは出力を解釈します。 VT100のような動作を実装するためのxtermのすべてのロジックがそこに複製されます。

この実装はカーネル内にあるため、ユーザースペースプロセスを介して中継することなく、関連する下位レベルのドライバー(GPU、キーボードがあるUSBバスなど)と直接通信できます。別のユーザースペースプロセスが関与していなければ、ttyの「マスターエンド」は必要ありません。

5
user41515

その時点で、セマンティクスに興味があるので、「はい、マスターがあります」と「いいえ、マスターがありません」の両方が正しいです。

はい、マスターがあります。コンソールドライバー自体です。スレーブ側が認識して送信する文字コードは、キーボードで実際に何が起こっているかとはほとんど関係がないか、まったく関係がありません。実際のハードウェアは、80年代半ばのハードウェアのような錯覚を与えるために、リダイレクト、再解釈、および再レンダリングの多くのレイヤーを経ています。

いいえ、マスターはありません。マスターはスレーブ側が見るものをプログラムで制御できます。カーネルの関連部分を文字通り置き換えることなく、それを行うことはできません。ロードキーを実行してキーストロークの解釈方法を制御できますが、通常のプログラムはそれ自体をデータフローに挿入できません。

3
jthill

用語に注意してください。ここで端末を「仮想」と呼ぶには、2つの異なる方法があります。

ターミナルエミュレータは仮想端末を作成しますが、通常は「仮想端末」とは呼ばれませんが、疑似端末です。ターミナルエミュレータは/dev/ptmxを開き、ターミナルのターミナルインターフェイス(「マスターエンド」と呼ばれます)を取得します。ターミナルで実行されているアプリケーションは、/dev/pts(「スレーブエンド」と呼ばれます)にあるターミナルのアプリケーションインターフェイスを使用します。

Linuxが「仮想端末」(vt)と呼ぶものは、コンソールとも呼ばれます。同じキーボードと画面を共有する複数のvtがあるため、仮想です。ここでは、アプリケーション側のデバイスが1つしかないため、マスターデバイスとスレーブデバイスの概念はありません。ターミナル側はカーネルによって内部的に処理されます(マスターエンドはカーネル内に隠されていると言えます)。