TTY体系中设备节点的差别

2023年 2月 19日 54点热度 0人点赞

TTY体系中设备节点的差别

参考资料

1. 傻傻分不清

/dev/ttyS0、/dev/ttySAC0、/dev/tty、/dev/tty0、/dev/tty1、/dev/console,

它们有什么差别?

设备节点 含义
/dev/ttyS0、/dev/ttySAC0 串口
/dev/tty1、/dev/tty2、/dev/tty3、…… 虚拟终端设备节点
/dev/tty0 前台终端
/dev/tty 程序自己的终端,可能是串口、也可能是虚拟终端
/dev/console 控制台,又内核的cmdline参数确定

TTY/Terminal/Console/UART, 它们有什么差别?

术语 含义
TTY 来自teletype,最古老的输入输出设备,现在用来表示内核的一套驱动系统
Terminal 终端,暗含远端之意,也是一个输入输出设备,可能是真实设备,也可能是虚拟设备
Console 控制台,含控制之意,也是一种Terminal,权限更大,可以查看内核打印信息
UART 串口,它的驱动程序包含在TTY驱动体系之内

2. 要讲历史了

2.1 电传机teletype

teletype, 更准确地说是teleprinter, 是一种通信设备, 可以用来发送、接收文本信息.

teletype是一家公司的名字, 它生产的teleprinter实在太有名, 结果公司名变成了这类产品的名字: teleprinter都被称为teletype了.

kp1cc-kp1cc

teletype被用来传输商业电报, 想像一下:

  • 把两台teletype的线缆接在一起,或者使用无线技术连接两台teletype
  • 这边打字,另一边就可以接收到信息并通过纸张打印出来
  • 注意:这两台teletype可以离得很远

2.2 计算机需要控制

2.2.1 使用teletype

teletype的简称就是TTY.

最古老的计算机支持的是批处理模型:

  • 怎么编程?卡片打孔,然后喂给计算机。
  • 怎么得到输出信息?计算机根据结果在卡片上打孔,需要专人翻译这些卡片。

如果把两台teletype的其中一台, 替换为计算机, 不就更方便了吗?可以即时输入指令、即时看到结果.

于是teletype变成了计算机的终端、Terminal, 远端之意.

teletype和计算机可以放在一个房间里, 也可以放在很远很远的地方.

0qqwu-0qqwu

teletype是通过串口(UART)跟计算机相连的:

0af5f-0af5f

那时计算机很贵, 发展出多用户系统, 多个用户可以分时使用计算机, 降低成本:

rasxe-rasxe

2.2.2 teletype被淘汰了

1960年代, CRT显示器+键盘, 替代了teletype:

  • 显示器替代了纸张
  • 速度更快
  • 成本更低
  • 它仍然只是一个终端(terminal),通过线缆连接到计算机
  • 虽然不再是teletype,但是它的驱动程序仍然叫做TTY

cgnrz-cgnrz

2.2.3 个人电脑和虚拟终端

上图长得像电脑, 但是它只是一个终端, 它要连接到计算机才能工作.

这才是电脑: 计算单元(CPU、硬盘、内存等等)、终端(键盘、显示器)都齐全了:

bxfbl-bxfbl

硬件上只有一套键盘、显示器.

但是在Linux系统中, 我们可以打开多个命令行程序(也叫terminal、shell), 每个程序都对应一个"虚拟终端".

3. 在Ubuntu上演示

按住键盘: Ctrl+Alt+F3启动一个虚拟终端, Ctrl+Alt+F4再启动一个虚拟终端.

在里面切换为root用户:

sudo passwd root // 如果su root不成功,就先设置root密码
su root

3.1 各类设备节点的差别

由于历史原因, 下图中两条红线之内的代码被称为TTY子系统.

它既支持UART, 也支持键盘、显示器, 还支持更复杂的功能(比如伪终端).

e513l-e513l

3.2 /dev/ttyN(N=1,2,3,...)

/dev/tty3、/dev/tty4: 表示某个程序使用的虚拟终端

// 在tty3、tty4终端来回切换,执行命令

echo hello > /dev/tty3
echo hi    > /dev/tty4

3.3 /dev/tty0

/dev/tty0: 表示前台程序的虚拟终端

  • 你正在操作的界面, 就是前台程序
  • 其他后台程序访问/dev/tty0的话, 就是访问前台程序的终端, 切换前台程序时, /dev/tty0是变化的
    // 1. 在tty3终端执行如下命令
    // 2. 然后在tty3、tty4来回切换
    
    while [ 1 ]; do echo msg_from_tty3 > /dev/tty0; sleep 5; done
    

3.4 /dev/tty

/dev/tty表示本程序的终端, 可能是虚拟终端, 也可能是真实的中断.

程序A在前台、后台间切换, 它自己的/dev/tty都不会变.

// 1. 在tty3终端执行如下命令
// 2. 然后在tty3、tty4来回切换

while [ 1 ]; do echo msg_from_tty3 > /dev/tty; sleep 5; done

3.5 Terminal和Console的差别

Terminal含有远端的意思, 中文为: 终端.  Console翻译为控制台, 可以理解为权限更大、能查看更多信息.

比如我们可以在Console上看到内核的打印信息, 从这个角度上看:

  • Console是某一个Terminal
  • Terminal并不都是Console。
  • 我们可以从多个Terminal中选择某一个作为Console
  • 很多时候,两个概念混用,并无明确的、官方的定义

3.6 /dev/console

选哪个?内核的打印信息从哪个设备上显示出来? 可以通过内核的cmdline来指定, 比如: console=ttyS0 console=tty 我不想去分辨这个设备是串口还是虚拟终端, 有没有办法得到这个设备? 有!通过/dev/console! console=ttyS0时: /dev/console就是ttyS0 console=tty时: /dev/console就是前台程序的虚拟终端 console=tty0时: /dev/console就是前台程序的虚拟终端 console=ttyN时: /dev/console就是/dev/ttyN console有多个取值时, 使用最后一个取值来判断

行规程的引入

p2bk2-p2bk2

以下文字引用自参考资料解密TTY:

大多数用户都会在输入时犯错, 所以退格键会很有用. 这当然可以由应用程序本身来实现, 但是根据UNIX设计“哲学”, 应用程序应尽可能保持简单. 为了方便起见, 操作系统提供了一个编辑缓冲区和一些基本的编辑命令(退格, 清除单个单词, 清除行, 重新打印), 这些命令在行规范(line discipline)内默认启用. 高级应用程序可以通过将行规范设置为原始模式(raw mode)而不是默认的成熟或准则模式(cooked and canonical)来禁用这些功能. 大多数交互程序(编辑器, 邮件客户端, shell, 及所有依赖curses或readline的程序)均以原始模式运行, 并自行处理所有的行编辑命令. 行规范还包含字符回显和回车换行(译者注: \r\n 和 \n)间自动转换的选项. 如果你喜欢, 可以把它看作是一个原始的内核级sed(1).

另外, 内核提供了几种不同的行规范. 一次只能将其中一个连接到给定的串行设备. 行规范的默认规则称为N_TTY(drivers/char/n_tty.c, 如果你想继续探索的话). 其他的规则被用于其他目的, 例如管理数据包交换(ppp, IrDA, 串行鼠标), 但这不在本文的讨论范围之内.

TTY驱动程序框架

6wcf9-6wcf9

原文地址: TTY体系中设备节点的差别

rainbow

这个人很懒,什么都没留下

文章评论