TTY体系中设备节点的差别

Posted Heavy sea

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TTY体系中设备节点的差别相关的知识,希望对你有一定的参考价值。

一、设备节点及有关术语的含义

设备节点含义
/dev/ttyS0、/dev/ttySAC0串口
/dev/tty1、/dev/tty2、/dev/tty3、……虚拟终端设备节点
/dev/tty0前台终端
/dev/tty程序自己的终端,可能是串口、也可能是虚拟终端
/dev/console控制台,又内核的cmdline参数确定
术语含义
TTY来自teletype,最古老的输入输出设备,现在用来表示内核的一套驱动系统
Terminal终端,暗含远端之意,也是一个输入输出设备,可能是真实设备,也可能是虚拟设备
Console控制台,含控制之意,也是一种Terminal,权限更大,可以查看内核打印信息
UART串口,它的驱动程序包含在TTY驱动体系之内

teletype的简称就是TTY,teletype(电传机),更准确地说是teleprinter,是一种通信设备,使用两台teletype可以用来发送、接收文本信息。
teletype可以与计算机相连,即可即时输入指令,看到结果。于是teletype变成了计算机的终端、Terminal,远端之意。操作系统对这类设备的驱动程序命名为TTY。
随着显示器和键盘的出现,teletype被淘汰了,但驱动程序的命名仍然保留了TTY。

Console可以理解为权限更大的终端设备。

串口也是一种输入输出设备,跟我们所使用的显示器和键盘属于同一种设备,故它的驱动程序也被归为TTY体系当中。

二、ubuntu演示

1.启动虚拟终端

在Linux系统中,我们可以打开多个命令行程序(也叫terminal、shell),每个程序都对应一个"虚拟终端"。
在Ubuntu下,Ctrl+Alt+F3启动一个虚拟终端,Ctrl+Alt+F4再启动一个虚拟终端。


虚拟终端界面

2.设备节点

1. /dev/ttyN(N=1,2,3,…) 表示某个程序使用的虚拟终端

/dev/tty3、/dev/tty4:

// 在tty3 界面输入以下指令,第一条指令会在当前界面打印。
//第二条会在tty4界面打印出来(Ctrl+Alt+F4切换至tty4界面)
echo hello > /dev/tty3
echo hi > /dev/tty4

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

正在操作的界面,就是前台程序
其他后台程序访问/dev/tty0的话,就是访问前台程序的终端,切换前台程序时,/dev/tty0也会随着变化

// 1. 在tty3终端执行如下命令
// 2. 然后在tty3、tty4来回切换
while [ 1 ]; do echo msg_from_tty3 > /dev/tty0; sleep 5; done

上面代码是在tty3终端下执行,因为此时tty3就是前台程序的虚拟终端,但切换至tty4后,前台程序虚拟终端便是tty4,执行结果便显示在了tty4上。

3. /dev/tty:表示本程序的终端

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

// 1. 在tty3终端执行如下命令
// 2. 然后在tty3、tty4来回切换
while [ 1 ]; do echo msg_from_tty3 > /dev/tty; sleep 5; done

与 /dev/tty0不同的是,执行结果只会在本程序的终端tty3下显示,切换至tty4终端是没有任何显示结果的。

4. Terminal和Console的差别

Terminal含有远端的意思,中文为:终端。Console翻译为控制台,可以理解为权限更大、能查看更多信息。
比如我们可以在Console上看到内核的打印信息,从这个角度上看:

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

5. /dev/console

console可以通过内核的cmdline来指定,
比如: console=ttyS0 console=tty
console=ttyS0时:/dev/console就是ttyS0
console=tty时:/dev/console就是前台程序的虚拟终端
console=tty0时:/dev/console就是前台程序的虚拟终端
console=ttyN时:/dev/console就是/dev/ttyN
console有多个取值时,使用最后一个取值来判断

// 查看内核的cmdline
cat /proc/cmdline

如果内核的cmdline没有指定console(如上图),那么/dev/console对应第一个TTY设备。
如果内核先安装串口驱动,那么/dev/console就对应第1个串口,如果内核先安装虚拟终端的驱动,那么/dev/console就对应/dev/tty0也就是前台终端。

三、TTY驱动程序框架


TTY I/O这一层替我们屏蔽了不同输入输出设备的差别
驱动程序从键盘获取数据后保存在某个vitual console中,应用程序也会把要显示的数据存在某个vitual console的缓冲区中,等到终端位于前台时,才从缓冲区把数据显示在显示器上。

假设arm板与PC端口连接使用串口登录,需要在PC端的串口连接终端上显示字符。
PC端通过串口把要显示的字符发送至arm板,arm板的串口驱动程序接收后会把字符上传至line discipline(行规程),行规程会分析该字符。
若只是一个普通的字符便会把字符返回至驱动程序,再通过串口发送到PC端的串口,此时PC端再进行显示,这也叫回显。
若行规程发现接收到的字符是删除,便会把行规程的缓冲区(保留原先字符)的字符删除掉,然后会把删除字符也会返回给PC端,PC端通过软件把字符删除。因此“删除"只是显示的效果,实际上串口工具仍然接收到了数据。
若行规程发现接收到的字符是回车命令,代表要执行某个指令,则行规程会上传至应用程序,应用程序把得到的信息再次返回到行规程,再通过驱动程序、串口让PC端显示信息。

以上是关于TTY体系中设备节点的差别的主要内容,如果未能解决你的问题,请参考以下文章

TTY体系中设备节点的差别

iOS8中设备旋转后的ViewController偏移量

vscode中设置vue代码片段

Keepalived中Master和Backup主备切换机制浅析

在片段中设置文本颜色

资产目录中设备特定图像集中的设备