下一页 上一页 目录

8. 关于终端工作原理的一些细节

如果您对终端几乎一无所知,建议您首先阅读简介,并阅读终端工作原理概述

8.1 终端内存细节

终端屏幕可能会以每秒 60 次的速度刷新自身,图像存储在终端的内存中。对于 PC 而言,显示器的图像存储在计算机内部的显卡上,但对于终端而言,显卡的等效设备位于终端内部。对于文本终端,图像存储占用内存很小。它没有将屏幕上的每个点(像素)都放入内存中,并需要存储大约 25 万个点,而是使用了一种更高效的存储方法。

屏幕上显示的文本可以通过 ASCII 字节在终端内存中表示,屏幕上的每个字符对应一个字节。整个屏幕仅占用大约 2K 的 ASCII 字节。为了显示这些字符,终端还必须知道近 100 个可打印 ASCII 字符中每个字符的位图(形状)。如果一个字符的位图使用 15 个字节,那么所有 ASCII 字符的位图(字体)只需要大约 1.5K 的内存。扫描此 ASCII 文本和字体内存,使生成的图像大约每秒 60 次显示在屏幕上。这是一种共享内存的形式,其中字母(例如字母 e)的单个位图由屏幕上显示的所有字母 e 共享。低内存需求意味着 1980 年代早期生产显示器的成本较低,当时内存的成本比今天高出几千倍(当时每千字节的成本为几美元)。

8.2 早期终端

第一批终端有点像远程控制的打字机,只能“显示”(打印在纸上)从计算机发送给它们的字符流。最早的型号被称为电传打字机。“tty”这个名称只是“Teletype”(电传打字机)的缩写。早期的终端可以像打字机一样执行换行和回车操作,并在收到响铃字符时发出铃声。由于缺乏重要的功能,这种类型的终端首先被标记为“哑终端”。当计算机无法确定它正在与哪种类型的终端通信时,今天有时仍会使用这种类型的终端接口(使用称为“哑终端”的终端类型)。

8.3 转义序列和控制码(简介)

终端具有许多功能,其中一些功能始终存在,而另一些功能则需要来自计算机的命令才能更改或激活。为了在计算机的控制下行使所有这些功能,需要建立特殊的代码,以便计算机可以告诉终端该做什么。主要有两种类型的代码:转义序列和控制码(控制字符)。转义序列的数量比控制码多得多。

控制码

控制码(或控制字符)由 ASCII 字母表的前 32 个字节组成。它们包括以下内容:回车符(光标到最左侧)、换行符(光标向下移动一行)、退格键、转义字符、制表符和响铃。它们通常不会显示在屏幕上。通常有一个命令可以提供给您的终端,这将导致它们在被终端接收时显示出来。它被称为“显示控制”或“监视器”之类的名称。如果您这样做,则显示可能会变得混乱,因为所有以 ESC(转义)控制字符开头的转义序列将不再执行。应该出现在屏幕顶部或底部的单词将显示在其他位置。用于在屏幕上重新定位光标的转义序列会显示,但光标不会移动到转义序列指定的位置。

转义序列

由于控制码的数量远远不足以完成所有操作(并且由于某种原因,并非所有控制码都被利用),因此使用了许多转义序列。它们由“转义”(ESC)控制字符后跟一系列普通字符组成。收到转义字符后,终端会检查其后的字符,以便它可以解释序列并执行来自计算机的预期命令。一旦它识别出有效序列的结尾,随后收到的字符就会显示在屏幕上(除非它们是控制码或更多转义序列)。某些转义序列可能需要参数(或自变量),例如屏幕上光标要移动到的坐标。参数成为转义序列的一部分。 转义序列列表在网络上可用于某些终端,但它很简洁。

终端的转义序列列表应在终端的“程序员手册”中。除了非常旧的终端外,可能有两三百个这样的序列。如果您没有这样的手册,则不容易找到它们。其中一些序列在互联网上可用。一个链接是转义序列列表。通过在互联网上搜索一个序列(例如 ESC[5m),您可能会遇到一个很长的列表。

确定其中一些序列的另一种方法是找到终端的 terminfo 条目 (termcap) 并对其进行手动解码。请参阅本文档中的Terminfo 和 Termcap(详细)和/或互联网上的Termcap 手册。不幸的是,终端的 terminfo (termcap) 通常不会列出终端可用的所有转义序列,但幸运的是,最重要的序列通常都在那里。

8.4 显示属性和魔术饼干

终端具有生成字符属性的各种方法,例如粗体、反相视频、下划线等。用户应该不需要担心这是如何完成的,除非它为某些旧终端带来了问题,并且在新终端的设置菜单中有时会有一个选项用于此。

魔术饼干方法已经过时。它是定义属性的最简单(也是最差)的方法:使用某个字节作为属性的开始,另一个字节作为属性的结束。例如,“开始下划线”魔术饼干字节放置在要加下划线的第一个单词之前。这些额外的字节被放入屏幕页面的内存中,就像显示为字符的字符字节一样。但这可能会扰乱每行字符数的计数,因为不可打印的魔术饼干字符与其他可打印字符混合在一起。这有时会导致问题。

一种更好但占用更多内存的方法是为每个显示的字符分配一个属性字节(或半字节等)。PC 显卡(用于文本)为常见的 PC 显示器使用了这种方法。


下一页 上一页 目录