在linux中,/dev/目录下有很多设备。tty0 tty1 console,以及/dev/pts目录下。Linux是如何管理这些终端串口的呢。终端是一种字符设备,通常用tty简称各种类型的终端设备。
串口终端:/dev/ttyS
串口终端是使用计算机串口连接的终端设备。Linux把每个串行端口都看作一个字符设备。这些串行端口所对应的设备名称是/dev/ttySAC0 /dev/ttySAC1等等。
控制台终端:/dev/console 虚拟设备
在linux中,计算机的输出设备通常被称为控制台终端(Console),这里特指printk信息输出到的设备。/dev/console是一个虚拟设备,它需要映射到真正的tty上,比如通过内核启动参数。console=ttySAC0就是把console映射到了串口0。
虚拟终端:/dev/tty*
当用户登入时,使用的是虚拟终端。使用Ctcl + Alt +F1-F6组合键时,我们可以切换tty1- tty6.这些称为虚拟终端,而tty0是表示当前使用的虚拟终端的一个别名。
曾经碰到一个问题:设备在使用telnet登入的时候无法打印内核printk的打印。如何实现一个功能,在虚拟终端也能看到内核的打印??
tty子系统包括:tty核心,tty线路规程和tty驱动层。tty核心是对整个tty设备的抽象,对用户提供统一的接口,tty线路规程是对传输数据的格式化,tty驱动是面向tty设备的硬件驱动。
如何在内核中回溯调用关系:dump_stack();
串口调用关系:
sys_write
vfs_write
tty_write
n_tty_write(实际上就是线路规程ldisc_write)
uart_write
uart_start
s3c24xx_serial_start_tx()