我想知道通过在 GNOME 中打开“终端”获得的文本模式与在没有 GUI 的服务器 Linux 发行版中交互的文本模式之间的区别。
我知道名为“terminal”的程序是一个模拟器。我想了解幕后的机制。例如,scanf()
在这两种情况下如何调用管理?如果“终端”实现了基于GUI的文本模式,那么另一种文本模式的来源是什么? (我的意思是显示闪烁光标并移动它等的代码)BIOS?内核?用户空间中的进程?
答案1
在所有情况下,shell 都会看到 TTY 或 PTY 设备以及 TERM 环境变量,该变量将识别要使用的正确的终端控制代码集。
当使用 GNOME 的终端窗口时,设备是 UNIX 98 风格的 PTY:/dev/pts/*
。当终端窗口处于活动状态并接收 X11/Wayland 键盘事件时,GNOME 终端进程会将它们转换为 UTF-8 字符并将它们输入 PTY 设备的“主”端,因此 CLI 进程从另一端获取它们(传统上) PTY 设备的“从设备”)一侧。
输出的处理方式相同:CLI 进程将 UTF-8 字符和终端控制代码(由 TERM 环境变量标识的正确代码集)写入 PTY 设备,GNOME 终端进程从 PTY 设备的其一侧读取它们,使用它们作为模拟终端的输入,并将模拟视图渲染为 X11/Wayland 图形。
在 Linux 虚拟控制台设备 ( /dev/tty[1..n]
) 上时,过程大致相同,只是终端仿真在内核中运行,因此不存在对用户空间可见的“主”PTY 设备的等效项。
如果您在串行控制台上操作,CLI 进程将获得一个“真正的”TTY 设备:串行端口 ( /dev/ttyS[0..n]
)。无论串行电缆另一端是什么,都将负责其余部分:如今,它可能是另一个终端仿真器,例如运行 Linux 的笔记本电脑minicom
或包含串行端口支持的相当新版本的 PuTTY。或者它可能是一个真实的终端:可能是一个真实的 Digital VT 系列终端,或者是 HP 700/96。
或者如果你是严重地进入逆计算,可能是20 世纪 30 年代的机电怪物。
答案2
电信的答复解释程序如何与终端(真实的或其他的)对话。
您的问题还有另一部分,即当图形终端模拟器未提供终端处理时,终端处理所在的位置。目前存在三种可能性。
硬件文本模式,内核终端仿真。这依赖于硬件提供文本模式支持,顶部有一个薄控制台层(例如
vgacon
甚至mdacon
)。内核将实际字符(带有属性)写入视频缓冲区,然后使用硬件字符生成器将它们转换为屏幕上显示的像素。光标也由硬件处理(包括闪烁;请参阅MS-DOS 光标是什么字符?了解详情)。在此设置中,不可能有“图形”输出(尽管创造性地使用了字体)。终端仿真本身,例如将 VT 转义码转换为字符移动,进行处理由内核。帧缓冲区、内核终端仿真。这使用了常见的帧缓冲区抽象(
fbcon
)以提供使用图形帧缓冲区的文本模式控制台。在此变体中,内核将字符转换为像素,处理光标,并且显示不限于文本 - 图形程序也可以运行(无论特定于帧缓冲区,例如福比达或使用带有库(如 SDL 或 Gtk)的帧缓冲区后端。终端仿真的处理方式与第一种变体相同。帧缓冲区,用户空间终端仿真。这使用与之前的变体相同的图形支持,但添加了一个用户空间终端模拟器,例如公里斯康。在这种情况下,从文本输出到屏幕上像素的转换是在程序内部完成的,而不是内核。