TTY揭秘

前一阵子调试了一个串口驱动,原以为很简单,调式过程中还是遇到了很多问题。查阅了一些资料后发现Linux的串口设备,也就是tty子系统是一个很有历史,颇为复杂的一个子系统,值得好好研究一下。在网上找到了一篇关于tty的文章,感觉不错,决定翻译一下。水平有限,难免有误,希望大家指正。

原文地址:http://www.linusakesson.net/programming/tty/index.php


TTY揭秘

TTY揭秘_第1张图片 20世纪40年代的真实的电传打字机

TTY子系统对Linux和UNIX的设计至关重要。 不幸的是,它的重要性经常被忽视,很难找到关于它的好的介绍性文章。 我相信对Linux中的TTY的基本理解对于开发人员和高级用户来说至关重要。

但请注意:您将要看到的并不是特别优雅。 实际上,TTY子系统 - 虽然从用户的角度来看非常实用 - 但却是一个特殊情况的混乱。 要了解这是怎么回事,我们必须回到过去。

 

 

 

 

历史

1869年,证券报价机被发明了。这是一台机电机器,由一台打字机,一对长电线和一台自动收报机组成,其目的是实时远距离派发股票价格。这个概念逐渐演变成更快,基于ASCII的电传打字机(Teletype)。电传打字机曾经把世界各地连接到一个名为Telex的大型网络中,该网络用于传输商业电报,但电传打字机尚未连接到任何计算机。

然而,与此同时,计算机 - 仍然相当庞大和原始,但能够执行多任务 - 变得足够强大,能够实时与用户交互。当命令行最终取代旧的批处理模型时,电传打字机被用作输入和输出设备,因为它们在市场上很容易获得。

存在大量的电传打字机模型,都略有不同,因此需要某种软件兼容性层。在UNIX世界中,方法是让操作系统内核处理所有低级细节,例如字长,波特率,流量控制,奇偶校验,基本行编辑的控制代码等。20世纪70年代后期由固态视频终端(如VT-100)实现的精美光标移动,颜色输出和其他高级功能留给了应用程序。

目前,我们发现自己身处一个物理电传打字机和视频终端几乎绝迹的世界。除非您访问博物馆或硬件爱好者,否则您可能会看到的所有TTY都将模拟视频终端 - 真实的软件模拟。但正如我们将要看到的那样,旧铸铁野兽的遗产仍然潜伏在水面之下。

用例

用户在终端上输入(物理电传打字机)。该终端通过一对导线连接到计算机上的UART(通用异步接收器和发送器)。该操作系统包含一个UART驱动程序,用于管理字节的物理传输,包括奇偶校验和流控。在一个单纯的系统中,UART驱动程序然后将传入的字节直接传递给某个应用程序进程。但是这种方法缺乏以下基本特征:

行编辑。大多数用户在键入时会出错,因此退格键通常很有用。这当然可以由应用程序本身实现,但是根据UNIX设计理念,应该尽可能简化应用程序。因此,为了方便起见,操作系统提供了编辑缓冲区和一些基本的编辑命令(退格键,擦除字,清除行,重新打印),这些命令在行规程(line discipline)中默认启用。高级应用程序可能会通过将行规程设为原始模式(Raw Mode)而不是默认的加工模式(Cooked Mode)或规范模式(canonical mode)来禁用这些功能。大多数交互式应用程序(编辑器,邮件用户代理,shell,所有依赖于curses或readline的程序)都以原始模式运行,并自行处理所有行编辑命令。行规程还包含字符回显和回车符和换行符之间自动转换的选项。如果你愿意,可以把它想象成一个原始的内核级sed(1)。

顺便提一下,内核提供了几个不同的行规程。同一时刻仅能有其中一个附属于给定的串行设备。默认的行规程提供了行编辑,被称为N_TTY(drivers/char/n_tty.c, 如果你富有冒险精神)。其他行规程用于其他目的,例如管理分组交换数据(PPP,IrDA,串行鼠标),但这超出了本文的范围。

 

未完待续

 

你可能感兴趣的:(linux,tty,line)