当我打开一个终端模拟器时(xterm
例如),xterm
会有一个主端(/dev/ptmx
)和一个从端(/dev/pts/#
)。
但是当我打开虚拟终端(按Ctrl+Alt+F#
)时,虚拟终端是否也连接到主设备呢?或者它直接连接到从机(/dev/tty#
)而没有主机?
答案1
没有主人(因此它也不是奴隶)。
当您使用 时xterm
,该xterm
进程会在一端完成按键和像素之间的转换,并在另一端模拟串行端口字节流。内核xterm
通过 pty master来回转发内容。
当您使用 时tty1
,内核会自行完成所有这些工作。中的代码drivers/tty/vt/keyboard.c
解释按键并drivers/tty/vt/vt.c
解释输出。实现类似 VT100 行为的所有逻辑都xterm
在那里复制。
由于此实现位于内核中,因此它可以直接与相关的较低级别驱动程序(GPU、键盘所在的 USB 总线等)通信,而无需通过用户空间进程进行中继。如果不涉及另一个用户空间进程,就不需要 tty 的“主端”。
答案2
在这一点上,“是的,有一个大师”和“不,没有大师”都是正确的,因为你进入了语义学。
是的,有一个主控:控制台驱动程序本身。从属端看到并发送的字符代码与键盘上实际发生的情况几乎没有关系。真实的硬件正在经历多层重定向、重新解释和重新渲染,以呈现 80 年代中期硬件的幻觉。
不,没有主设备:主设备可以对从设备端看到的内容进行编程控制,如果不真正替换内核的相关部分,您就无法做到这一点。您可以运行 loadkeys 来控制击键的解释方式,但普通程序无法将自身插入数据流中。
答案3
请注意术语:这里可以通过两种不同的方式将终端称为“虚拟”。
终端模拟器创建一个虚拟终端,但通常不称为“虚拟终端”,而是伪终端。终端模拟器打开/dev/ptmx
并获取终端的终端接口(称为“主端”);终端中运行的应用程序使用终端/dev/pts
(称为“从端”)的应用程序接口。
Linux 所谓的“虚拟终端”(vt)也称为控制台。它是虚拟的,因为有多个虚拟机共享相同的键盘和屏幕。这里没有主设备和从设备的概念,因为只有一个设备,对于应用侧来说。终端端由内核内部处理(可以说主端隐藏在内核内部)。