在Linux系统中,终端是一类字符型设备,它包括多种类型,通常使用tty来简称各种类型的终端设备。
串口终端(/dev/ttyO*)
串口终端是使用计算机串口连接的终端设备。Linux把每个串行端口都看作是一个字符设备。这些串行端口所对应的设备名称是 /dev/ttyO0;/dev/ttyO1……
控制台终端(/dev/console)
在Linux系统中,计算机的输出设备通常被称为控制台终端(Console),是系统控制台,是与操作系统交互的设备。系统所产生的信息会发送到该设备上。这里特指printk信息输出到的设备。/dev/console是一个虚拟的设备,它需要映射到真正的tty上,比如通过内核启动参数 “console=ttyO0” 就把console映射到了串口0上。当调用printk时,内核将信息输出到控制台终端(/dev/console),由于console和ttyO0(串口0)关联了,所以信息将输出到调试串口0上了。
console有缓冲的概念,为内核提供打印输出。内核把要打印的内容装入缓冲区__log_buff,然后由console来决定打印到哪里(比如是tty0n还是ttySn等)。console指向激活的终端。
若要向一个端口发送数据,可以在命令行上把标准输出重定向到这些特殊文件名上即可。例如,在命令行提示符下键入:echo test > /dev/ttyS1会把单词”test”发送到连接在ttyS1(COM2)端口的设备上。
虚拟终端(/dev/tty*)
当用户登录时,使用的是虚拟终端。tty1–tty6等称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名.
TTY架构分析
Linux tty子系统由三个部分构成:
- tty核心(对整个tty设备的抽象 对用户提供统一的接口);
- tty线路规程(对传输数据的格式化);
- tty驱动(面向tty设备的硬件驱动);
TTY核心起到的是承上启下的作用,为我们用户空间访问TTY提供了一个统一的接口,不管底层硬件是串口,显示器还是什么,用户的访问使用的都是统一接口;
TTY线路规程在TTY模型中起到中间过渡的作用,它既接收来自TTY核心的数据,也接收来自TTY驱动的数据,根据实际访问的硬件设备所遵循的协议,对数据进行格式化。