我想知道通过在 GNOME 中打开“终端”获得的文本模式与在没有 GUI 的服务器 Linux 发行版中交互的文本模式之间的区别。
我知道名为“terminal”的程序是一个模拟器。我想了解幕后的机制。scanf()
例如,在这两种情况下如何调用管理?如果“终端”实现了基于GUI的文本模式,那么另一种文本模式的来源是什么?(我的意思是显示闪烁光标并移动它等的代码)BIOS?内核?用户空间中的进程?
我想知道通过在 GNOME 中打开“终端”获得的文本模式与在没有 GUI 的服务器 Linux 发行版中交互的文本模式之间的区别。
我知道名为“terminal”的程序是一个模拟器。我想了解幕后的机制。scanf()
例如,在这两种情况下如何调用管理?如果“终端”实现了基于GUI的文本模式,那么另一种文本模式的来源是什么?(我的意思是显示闪烁光标并移动它等的代码)BIOS?内核?用户空间中的进程?
在所有情况下,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。或者,如果您热衷于逆向计算,它可能是1930 年代的机电怪物。
telcoM 的答案解释了程序如何与终端对话(真实的或其他的)。
您的问题还有另一部分,即当图形终端模拟器未提供终端处理时,终端处理所在的位置。目前存在三种可能性。
硬件文本模式,内核终端仿真。这依赖于硬件提供文本模式支持,顶部有一个薄控制台层(例如
vgacon
或什至mdacon
)。内核将实际字符(带有属性)写入视频缓冲区,然后使用硬件字符生成器将它们转换为屏幕上显示的像素。光标也由硬件处理(包括闪烁;有关详细信息,请参阅MS-DOS 光标是什么字符?)。在此设置中,不可能有“图形”输出(尽管创造性地使用了字体)。终端仿真本身,例如将 VT 转义码转换为字符移动,由内核处理。帧缓冲区、内核终端仿真。它使用通用的帧缓冲区抽象 (
fbcon
) 来提供使用图形帧缓冲区的文本模式控制台。在此变体中,内核将字符转换为像素,处理光标,并且显示不限于文本 - 图形程序也可以运行(无论是特定于帧缓冲区的,如 fbida ,还是使用具有 SDL 等库的帧缓冲区后端或 Gtk)。终端仿真的处理方式与第一个变体相同。帧缓冲区,用户空间终端仿真。它使用与之前的变体相同的图形支持,但添加了用户空间终端模拟器,例如kmscon。在这种情况下,从文本输出到屏幕上像素的转换是在程序内部完成的,而不是内核。