----------------------------------------------------------------------------------------------------------------------------
内核版本:linux 5.2.8
根文件系统:busybox 1.25.0
u-boot:2016.05
----------------------------------------------------------------------------------------------------------------------------
一、终端(tty)
1.1 回顾
还记的在Mini2440之uboot移植流程之linux内核启动分析(六)小节中,我们介绍过u-boot在启动linux之前,需要做一些准备工作,比如配置启动参数:
#define CONFIG_BOOTARGS "root=/dev/mtdblock3 console=ttySAC0,115200 init=/linuxrc"
其中:
- root 指定文件系统位置,这里指定为NAND三号分区;
- init 指定内核启动后执行的第一个应用程序;
- console 指定使用哪个终端,这里的ttySAC0指的就是串口0;
1.2 tty
那什么是tty,tty是Teletype或Teletypewriter 的缩写,原来是指电传打字机,后来这种设备逐渐键盘和显示器取代。不管是电传打字机还是键盘显示器,都是作为计算机的终端设备存在的,所以tty也泛指计算机的终端(terminal)设备。
为了支持这些 tty设备,linux实现了一个叫做tty的子系统。所以 tty既指终端,也指linux的tty子系统,当然 tty还有更丰富(混乱)的含义,这一节我们将会解释。
1.2.1 硬件终端terminal
早期的终端(terminal) 是一台独立于计算机的机器(teletype 即, tty),大概像下面的样子:
它终端通过线缆与计算机连接,并完成计算机的输入输出功能:
现在物理终端实际上已经灭绝了,我们看到的所有tty都是模拟视频终端,即软件仿真出来的终端。
1.2.2 控制台console
提到终端就不能不提控制台console。控制台的概念与终端含义非常相近,其实现在我们经常用它们表示相同的东西,但是在计算机的早期时代,它们确实是不同的东西。
一些数控设备(比如数控机床)的控制箱,通常会被称为控制台,顾名思义,控制台就是一个直接控制设备的面板,上面有很多控制按钮。
在计算机里,把那套直接连接在电脑上的键盘和显示器就叫做控制台。而终端是通过串口连接上的,不是计算机自身的设备,而控制台是计算机本身就有的设备,一个计算机只有一个控制台。
计算机启动的时候,所有的信息都会显示到控制台上,而不会显示到终端上。这同样说明,控制台是计算机的基本设备,而终端是附加设备。
计算机操作系统中,与终端不相关的信息,比如内核消息,后台服务消息,都可以显示到控制台上,但不会显示到终端上。比如在启动和关闭 linux 系统时,我们可以在控制台上看到很多的内核信息.
现在终端和控制台都由硬件概念,逐渐演化成了软件的概念。简单的说,能直接显示系统消息的那个终端称为控制台,其他的则称为终端(控制台也是一个终端)。或者我们在平时的使用中压根就不区分 linux 中的终端与控制台。
1.2.3 tty设备
从历史上看,终端刚开始就是终端机,配有打印机,键盘,带有一个串口,通过串口传送数据到主机端,然后主机处理完交给终端打印出来。电传打字机(teletype)可以被看作是这类设备的统称,因此终端也被简称为tty(teletype的缩写)。
如下图所示:
其中:
- uart驱动:如上图所示,物理终端通过电缆连接到计算机上的 uart(通用异步接收器和发射器)。操作系统中有一个uart驱动程序用于管理字节的物理传输;
- 行规范:上图中内核中的 Line discipline(行规范)用来提供一个编辑缓冲区和一些基本的编辑命令(退格,清除单个单词,清除行,重新打印),主要用来支持用户在输入时的行为(比如输错了,需要退格);
- tty驱动:tty驱动用来进行会话管理,并且处理各种终端设备;
uart驱动、行规范和 tty驱动都位于内核中,它们的一端是终端设备,另一端是用户进程。因为在linux下所有的设备都是文件,所以它们三个加在一起被称为 "tty设备",即我们常说的 tty。
1.2.4 从软件仿真终端到伪终端
后来的终端慢慢演变成了键盘 + 显示器。如果我们要把内容输出到显示器,只要把这些内容写入到显示器对应的tty设备就可以了,然后由tty层负责匹配合适的驱动完成输出,这也是 linux 控制台的工作原理:
图中,tty驱动和行规范的行为与前面的示例类似,但不再有uart或物理终端。相反,软件仿真出视频终端,并最终被渲染到VGA显示器。注意,这里出现了软件仿真终端,它们是运行在内核态的。显示器和 tty1-tty6 都是软件仿真终端:
/dev/tty1-/dev/tty6 是这些仿真终端在文件系统中的表示,程序通过对这些文件的读写实现对仿真终端的读写。
如果我们在用户空间也进行终端仿真,情况会变得更加灵活,下图是xterm及其克隆的工作方式:
为了便于将终端仿真移入用户空间,同时仍保持tty子系统(tty子系统指tty 驱动和行规范)的完整,伪终端被发明了出来(pseudo terminal 或 pty)。伪终端在内核中分为两部分,分别是 master side和在tty驱动中实现的 slave side。注意上图中的 xterm,这是一个运行在用户态的终端仿真程序。
当创建一个伪终端时,会在 /dev/pts 目录下创建一个设备文件:
root@zhengyang:~# tty /dev/pts/2
如果是通过 PuTTY 等终端仿真程序通过 SSH 的方式远程连接 linux,那么终端仿真程序通过 SSH 与 PTY master side 交换数据。
1.2.5 伪终端
伪终端(pseudo terminal,有时也被称为pty)是指伪终端 master 和伪终端slave 这一对字符设备。其中的 slave 对应 /dev/pts/ 目录下的一个文件,而 master 则在内存中标识为一个文件描述符(fd)。伪终端由终端模拟器提供,终端模拟器是一个运行在用户态的应用程序。
Master 端是更接近用户显示器、键盘的一端,slave端是在虚拟终端上运行的 CLI(Command Line Interface,命令行接口)程序。linux 的伪终端驱动程序,会把 master 端(如键盘)写入的数据转发给 slave 端供程序输入,把程序写入slave端的数据转发给 master 端供(显示器驱动等)读取。请参考下面的示意图:
我们打开的终端桌面程序,比如 GNOME Terminal,其实是一种终端模拟软件。当终端模拟软件运行时,它通过打开/dev/ptmx文件创建了一个伪终端的master和slave对,并让shell 运行在slave端。当用户在终端模拟软件中按下键盘按键时,它产生字节流并写入master 中,shell 进程便可从slave中读取输入;shell 和它的子程序,将输出内容写入slave 中,由终端模拟软件负责将字符打印到窗口中。
伪终端大概有三类使用场景:
- 像xterm、gnome-terminal 等图形界面的终端模拟软件将键盘和鼠标事件转换为文本输入,并图形化地显示输出内容;
- 远程shell 应用程序(如 sshd)在客户机上的远程终端和服务器上的伪终端之间中继输入和输出;
- 多路复用器应用,如 screen 和 tmux。它们把输入和输出从一个终端转播到另一个终端,使文本模式的应用程序从实际的终端上脱离;
linux中为什么要提出伪终端这个概念呢?shell等命令行程序不可以直接从显示器和键盘读取数据吗?
为了同屏运行多个终端模拟器、并实现远程登录,还真不能让shell 直接跨过伪终端这一层。在操作系统的一大思想——虚拟化的指导下,为多个终端模拟器、远程用户分配多个虚拟的终端是有必要的。上图中的shell使用的slave 端就是一个虚拟化的终端。Master 端是模拟用户一端的交互。之所以称为虚拟化的终端,是因为它除了转发数据流外,还要有点终端的样子。
1.2.6 终端与伪终端的区别
至此我们可以得出这样的结论:现在所说的终端已经不是硬件终端了,而是软件仿真终端(终端模拟软件)。
关于终端和伪终端,可以简单的理解如下:
- 真正的硬件终端基本上已经看不到了,现在所说的终端、伪终端都是软件仿真终端(即终端模拟软件);
- 一些连接了键盘和显示器的系统中,我们可以接触到运行在内核态的软件仿真终端(tty1-tty6);
- 通过 SSH 等方式建立的连接中使用的都是伪终端;
- 伪终端是运行在用户态的软件仿真终端;
参考文章
[1]S3C2440 Linux UART 串口驱动-----1
[2]Linux UART 驱动 Part-1 (底层对接)
[3]Linux UART 驱动 Part-2 (tty 层流程)
[7]浅谈Linux tty体系,理清tty驱动层次与各种概念
[8]tty驱动初步了解学习
[9]解密TTY
[10]Linux 终端(TTY)(tty介绍来自该篇博客)
[11]Linux 伪终端(pty)
标签:仿真,tty,串口,终端,linux,驱动,控制台 From: https://www.cnblogs.com/zyly/p/17176980.html