Linux中的tty体系科普

嗨,好久不见!距离我上一次更新已经过去了一个多月,期间一直在为实现项目需求而努力。大概是10天前我实现了一个小型的本地系统并给导师展示,导师告知产品要商用并提出了更多的需求,此外为了方便量产要将平台从树莓派换到香橙派,于是漫漫学习路又要开始了。一直看韦东山老师的教程实在是有些无聊,恰好前段时间对tty体系感兴趣并收集了一些资料,好长时间没写文章手开始发痒,于是决定更新这篇文章。废话不多说,让我们直奔主题。

在ubuntu中我们按下快捷键ctrl+alt+t可以打开一个终端窗口:

用的韦东山的虚拟机所以账号是这个

输入命令ls并按下回车可以展示该目录下所有的文件和文件夹:

整个流程自然且符合自觉,可实际上这短短的两步需要计算机内部执行很多操作才能够实现。具体是什么操作呢,且听下回分解(划掉)。

好了,不开玩笑,其实这其中还牵扯到很多历史遗留问题,就让我们从打字机的历史开始讲起吧。

PS:之所以从历史讲起是因为我收集到的资料都是这么干的,不知是否引用的是同一篇文章的缘故,这些资料的文案都惊人的相似,当然我为了降低工作量也不能免俗。

机械打字机

为了提高文本输出的效率和规范性,人们发明了机械打字机,没听说过这个名词的请看这张图:

薇尔莉特的机械打字机

或者这张图:

《拯救大兵瑞恩》的截图,电影中的致歉信就是用机械打字机打印的

历史上第一台可实用的机械打字机发明于19世纪60年代末,并在19世纪末到20世纪中叶得到大规模的应用,并且催生出了打字员这个工种(一般由女性任职,这也是薇尔莉特的工作)。机械打字机一般用于将脑内的文字快速打印到纸上,需要手动进行回车和换行。机械打字机的出现极大地提高了人们文本输出的效率,但机械打字机之间无法建立连接并通信,只能将文字打印到纸上并通过交通途径运输到目的地,整个通信流程较长。总的来说,机械打字机是那个时代标志性的历史产物之一,你可以在众多的影视剧中见到它。

电传打字机

PS:虽然我的文章划分成了不同的章节,但需要注意的是,这些章节中出现的设备在历史上没有严格的先后之分,很多技术是并行的线,这里更多是针对特征进行区分。

从一位美国画家开始说起……

1839年,美国画家塞缪尔·莫尔斯(Samuel Morse)发明了莫尔斯电码。1844年,莫尔斯和他的同事成功实现了电报机的实用化,能够在两地之间发送和接收电报。实际上早期的电报机之间都是有线连接的(没想到吧,电报机不都是抗日影视剧中的无线连接,那是无线电被发明之后的事了)。1870年,第一台可实际应用的电传打字机开始出现,人们将这些电传打字机用线缆连接起来并广泛用于通信。

无线电的发明

1895年,意大利发明家马可尼成功进行了第一次 无线电通信实验。1901年,马可尼成功实现了从英国到加拿大的无线电通信,标志着无线电通信进入实用阶段。在这之后可用于无线通信的电传打字机也被发明出来,有线和无线电传打字机开始共存,各自在不同的应用场景中发挥作用。

teletype的成立

1906年,Morkrum-Kleinschmidt Company成立,该公司最初专注于开发和生产电报设备。1928年,Morkrum-Kleinschmidt Company 更名为Teletype Corporation,开始大规模生产电传打字机并成为行业内知名品牌。重点来了,因为这家公司的产品过于经典,以至于Teletype直接成为了电传打字机的代名词,缩写就是TTY。Teletype公司生产了很多电传打字机的经典型号:Model 15、Model 33和Model 38等。

连接计算机

1946年,世界第一台电子计算机ENIAC在美国诞生。此时电传打字机已经得到了广泛引用,人们希望将电传打字机连接到计算机上来实现和计算机交互。我们都知道字符文本需要经过编码才能进行传输,电报系统使用的摩尔斯电码已经不适用于计算机通信,早期也出现过几种用于计算机的编码方案但都没能统一。

1963年,ASCII标准应运而生,此标准统一了计算机在英语上的编码方案。同年,Teletype公司设计生产了第一款支持 ASCII 码的电传打字机——Model 33 TTY,此后电传打字机与计算机的通信更加高效。

Model 33 TTY

这个时候电传打字机作为一种和计算机交互的输入输出设备,交互手段更多是通过机械的形式来实现的,一个典型的例子是当时计算机的输出结果需要打印到纸上才能被人看到,可以参考下面的视频:

[转载]在30多年前的电传打字机上聊天是怎样一种体验?_哔哩哔哩_bilibili​www.bilibili.com/video/BV1Xx41137Tp/?spm_id_from=333.337.search-card.all.click&vd_source=34560d0efb8c7418a1ffe2109907031c​编辑https://link.zhihu.com/?target=https%3A//www.bilibili.com/video/BV1Xx41137Tp/%3Fspm_id_from%3D333.337.search-card.all.click%26vd_source%3D34560d0efb8c7418a1ffe2109907031c

这种机械式电传打字机和计算机交互的典型流程如下图所示:

图源B站UP——kami陆

下文是对B站UP——kami陆视频的原文引用:

为了将不同型号的电传打字机接入计算机,我们需要在操作系统内核安装驱动,为上层应用屏蔽所有底层细节,电传打字机通过两根线缆插入到UART串口连接到计算机,一根用于向计算机发送指令,另一根用于接收计算机的输出。操作系统包含一个串口的驱动程序,用于管理字节的物理传输,输入的字符序列被传递给tty驱动,这个驱动包含一个line discipline(行规范), 这个规范负责转换特殊字符(如退格、清行等)并且将收到的内容传回给电传打字机 [1]

说到这里可能有朋友会产生一个疑惑:为什么需要引入tty driver?

这里我引用优快云作者——闪耀大叔博文的内容:

tty driver并不是一个真正的驱动,只是抽象出一些接口, 对于应用程序而言,他就是个driver,对于应用程序,底层的差异是被屏蔽了的,相当于: tty硬件-tty硬件driver-应用程序,所以其实也并不把他叫driver,而一般叫tty core核心。……现在的tty driver一般指的是输入设备的硬件驱动(比如键盘)。……tty驱动,行规程,tty核心三部分共同组成tty设备 [2]

最后说说我的理解:

用户通过电传打字机输入的字符通过串口传输到行规范的缓冲区并存储,之后行规范将输入的字符回传到电传打字机并打印到纸上。当行规范检测到用户按下回车键时,会将缓冲区内的数据传递给用户进程并将用户进程的输出结果通过串口传输到电传打字机并打印。

视频终端设备

随着电子技术的发展,计算机的性能得到了极大的提高,传统的机械式电传打字机已经逐渐无法满足人们的需求。视频终端(Video Terminal)开始登上历史舞台,并逐渐取代电传打字机,这里不得不提到一家公司——DEC。

1957年,DEC公司(Digital Equipment Corporation)在美国成立,主营小型计算机的制造和销售。1970年,DEC推出了经典的16位小型计算机PDP-11并一炮而红。DEC在小型计算机领域的成就在此按下不表,我们主要关注它在视频终端设备上的贡献:

1975年,DEC公司推出VT05终端,虽然功能相对简单,但它为后来的终端设备奠定了基础。
1978年,DEC公司推出VT100终端,这是DEC最著名和最成功的视频终端之一,该终端的设计和功能被许多后续的终端设备所模仿和采用。

VT100终端,图源网络

我猜很多人看到这张图片会产生新的疑问:这不就是显示器和键盘吗?

虽然长得很像,但视频终端和显示器还是有很大区别的,主要体现在以下几点:

1、早期的计算机巨大且昂贵,无法做到人手一台,使用方法往往是一台主机连接多台终端,通过分时系统给不同的用户分配计算资源。

2、视频终端一般使用串口和主机相连接,而串口在现代显示器上已经基本淘汰。

3、受限于当时的显示技术,视频终端往往只能显示一种颜色,也无法显示复杂的图形界面。

视频终端虽然取代了电传打字机,但和计算机的交互流程并没有发生多大的变化。

键盘+显示器

后面的故事我们就熟悉了,随着计算机技术的进一步发展,计算机的体积减小成本降低,个人电脑(Personal Computer)逐渐普及。也正是这个时期,计算机的性能足以支持带有图形界面的操作系统的运行,视频终端被键盘+显示器的组合所取代。但新的问题也随之出现:如何让传统的tty体系和现代的图形化界面兼容呢?

有人可能会说:重新写这部分的代码不就行了?

可说起来容易,做起来难,延续了多年的tty体系,想在短期内改成稳定可靠的新版本是很难的,而程序员大多都比较懒,肯定不会直接这么做。

为了解决这个历史遗留问题,包括Linux在内的众多操作系统引入了终端模拟器

图源B站UP——kami陆

继续引用B站UP——kami陆的视频原文:

现代的Linux系统监听来自键盘的事件并将其发送到终端模拟器,终端模拟器和tty驱动交互,并从tty驱动中读取响应,再通过显卡渲染到显示器上 [1]

真终端

需要注意的是,这里的终端模拟器被包含在kernel内,是运行在内核态的,虽然是被模拟出来的,但这种终端依然被称为真终端(至于为什么后面会讲)。典型的真终端界面如下图所示(这个界面下没有鼠标):

可能很多人没用过这种界面,进入这种界面的快捷键一般是ctrl+alt+f3~f5。

PS:一般来说,真终端在Linux内核中分配了六个(/dev/tty1~tty6),可通过Ctrl-Alt-F1~F6切换,/dev/tty0指的是用户当前正在使用的虚拟终端。但不知道是不是版本或设置过的原因,我这的ubuntu按Ctrl-Alt-F1是进入登录页面,按Ctrl-Alt-F6没反应,但进入tty5的界面后按alt+→可以进入tty6。

这些没有图形界面的真终端相当于连接到同一台主机的若干物理终端,这些物理终端共享一个局域网,相互之间可以通过enco命令发送消息(脑洞大开:这些终端之间是不是可以来一把局域网CS1.6)。

我为什么要强调没有图形界面的真终端呢?

因为我发现按ctrl+alt+f2进入的是ubuntu默认的图形界面,问了一下AI,回答如下:

Linux 图形界面的核心部分(虚拟终端和 X 服务器)是运行在内核态的,而上层的桌面环境则运行在用户态

也就是说,Linux内核分配了其中一个虚拟终端用于运行带图形界面的桌面环境,开机默认进入的就是这个虚拟终端。

伪终端

和真终端相对应的是伪终端(pty),也就是大部分人更熟悉的这个:

真终端和伪终端的主要区别如下:
1、真终端运行在内核态,而伪终端运行在用户态。

2、真终端的界面会铺满整个屏幕,也看不到鼠标;伪终端一般以小窗口的形式出现,可以放大缩小

3、真终端的数量有限,伪终端可以创建很多个。

注:伪终端也是用终端模拟器模拟出来的

至于伪终端的实现机制(pty master和pty slave),实话说比较复杂,这里就不展开了。

shell、terminal和console

shell、terminal和console这几个名词经常成对出现,很多人弄不清它们之间的区别,这里也讲一下。

shell翻译过来是壳的意思,那么问题来了:shell是谁的壳?

答案是:操作系统。

在早期操作系统没有图形界面的时候,操作系统和人的交互正是通过shell进行的,换句话说,shell建立起了人和操作系统沟通的桥梁[2]

但shell只是个应用程序,它只负责将用户输入的命令解析后发送给系统内核并返回系统输出的数据,这些内容在哪里呈现给用户看呢?

答案是:terminal。

下图能更直观地展示shell和terminal间的关系:

图源B站UP——kami陆

正因为shell和terminal这种紧密的关系,所以这两者一般成对出现。

另外解释一下上图中shell的分支,shell指的是一类应用程序,这种程序有很多个不同版本:sh、bash(Linux一般用这个)、cmd、powershell[1]。拿聊天软件为例,主流的就两个:QQ和微信,这两种都有不少人用,青少年可能用QQ的比较多,中老年则更倾向于用微信。

其实操作系统发展到今天,shell也不再只局限于命令行,图形化的shell也出现很久了,比如windows中的资源管理器就是图形化的shell(explorer.exe)[1]

至于console,请参考下面这张图:

图源优快云博主——闪耀大叔

console指的是控制台,早期的电脑一般都自带一个带有大量开关和指示灯的面板,这个面板就叫console,和主机共享一个机柜[2]

随着时代的发展,物理意义上的console已经消失,现在的console一般都是泛指,我们通过terminal控制电脑,那么terminal就可以称为console。


拓展知识:

Linux只是GNU/Linux操作系统的内核, 内核只是操作系统的一部分,用于其他应用程序的调度。完整的操作系统是自带一些必须的应用程序的,GNU/Linux操作系统大部分自带的应用程序来自于GNU工程(比如shell有众多版本,Linux一般默认的shell是bash,而bash正来自于GNU;此外著名的GCC编译器同样来自于GNU),这也是GNU/Linux操作系统名称的由来 [3]

好了,对于tty体系的科普到这里就告一段落了。

纵观tty的发展史,又何尝不是人类输入输出设备波澜壮阔的发展历史!


注:未标注来源的图片来自于网络,这些图片仅用于科普,若构成侵权本人将第一时间进行删改。

觉得文章有帮助的朋友可以点赞收藏转发支持一下,感谢!

当然,也欢迎来我其他的内容平台逛逛,B站、知乎、公众号同名。

参考

  1. ^abcd【技术杂谈】shell和terminal_哔哩哔哩_bilibili
  2. ^abc浅谈Linux tty体系,理清tty驱动层次与各种概念-优快云博客
  3. ^【技术杂谈】Unix 到 GNU/Linux的操作系统历史_哔哩哔哩_bilibili
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值