接前一篇文章:Linux内核TTY子系统有什么(1)
本文内容参考:
Linux TTY子系统框架-CSDN博客
一文彻底讲清Linux tty子系统架构及编程实例-CSDN博客
linux TTY子系统(3) - tty driver_sys tty device driver-CSDN博客
Linux TTY 子系统框架_linux tty体系-CSDN博客
LinuxTTY 子系统2_tty子系统-CSDN博客
Linux TTY Driver_tty driver配置-CSDN博客
UART驱动学习二(TTY体系)_serdev-CSDN博客
解密TTY - QiuhaoLi - 博客园
特此致谢!
一、TTY是什么?
2. TTY的分类
上一回提到,TELETYPE变成了计算机的终端(即Terminal,远端之意)。Linux系统的终端设备一般分为控制台、伪终端pty、串口终端(/dev/ttySn)和其它类型。
(1)系统控制台(/dev/console)
/dev/console是系统控制台,是与操作系统交互的设备。系统所产生的信息会发送到该设备上。平时我们看到的PC只有一个屏幕和键盘,它其实就是控制台。目前只有在单用户模式下,才允许用户登录控制台/dev/console(可以在单用户模式下输入tty命令进行确认)。
console有缓冲的概念,为内核提供打印输出。内核把要打印的内容装入缓冲区__log_buff,然后由console来决定打印到哪里(比如是tty0、还是ttySn等)。console指向激活的终端。历史上,console指主机本身的屏幕和键盘,而tty指用电缆链接的其它位置的控制台。
某些情况下console和tty0是一致的,就是当前所使用的是虚拟终端,也是激活虚拟终端。所以有些资料中称/dev/console是到/dev/tty0的符号链接。但是这样说现在看来是不对的:根据内核文档,在2.1.71之前,/dev/console根据不同系统设定,符号链接到/dev/tty0或者其它tty*上;在2.1.71版本之后则完全由内核代码内部控制它的映射。
一个终端设备要实现console功能,必须向内核注册一个struct console结构,一般的串口驱动中都会有。如果设备要实现tty功能,必须要向内核的tty子系统注册一个struct tty_driver结构,注册函数在drivers/tty/tty_io.c中。一个设备可以同时实现console和tty_driver,一般串口都这么做。
内核的打印信息从哪个设备上显示出来?可以通过内核的cmdline来指定,比如: console=ttyS0 console=tty,可通过以下命令查看cmdline:
cat /proc/cmdline
在笔者电脑中的虚拟机中,此命令的执行结果为:
$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-6.5.0-27-generic root=UUID=0ade49ec-d3a4-49f8-9775-384fca0229cf ro find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US quiet splash
可见,在笔者的虚拟机中,并未指定console。
$ ls /dev/console
/dev/console
$
$ ls /dev/console -l
crw--w---- 1 root tty 5, 1 12月 29 21:44 /dev/console
如果不想去分辨这个设备是串口还是虚拟终端,有没有办法得到这个设备?有!通过/dev/console。
console=ttyS0时:/dev/console 就是ttyS0
console=tty时:/dev/console 就是前台程序的虚拟终端
console=tty0时:/dev/console 就是前台程序的虚拟终端
console=ttyN时:/dev/console 就是/dev/ttyN
console有多个取值时,使用最后一个取值来判断
不管你在哪里往/dev/console里写东西,这些东西总会出现在系统当前的焦点终端上。
更多内容请看下回。