[国嵌攻略][127][tty驱动程序架构]
tty概念解析
在Linux系统中,终端是一类字符型设备,它包括多种类型,通常使用tty来简称各种类型的终端设备。
1.串口终端(/dev/ttyS*)
串口终端是使用计算机串口连接的终端设备。Linux把每个串口端口都看作是一个字符设备。这些串口设备所对应的设备名称是/dev/ttySAC0,/dev/ttySAC1...
2.控制台终端(/dev/console)
在Linux系统中,计算机的输出设备通常被称为控制台终端(console),这里特指printk信息输出到的设备。/dev/console是一个虚拟的设备,它需要映射到真正的tty上,比如通过内核启动参数”consle=ttySAC0”就是把console映射到了串口0。
3.虚拟终端(/dev/tty*)
当用户登录时,使用的是虚拟终端。使用ctrl+atl+[F1-F6]组合键,我们就可以切换到tty1,tty1,tty3等上面去。tty1-tty6等称为虚拟终端,而tty0则是当前所使用的虚拟终端的一个别名。
4.三种终端的关联
内核使用printk函数把信息输出到控制台终端上,控制台终端通过关联串口终端把信息输出到实际的硬件上。应用程序把信息输出到虚拟终端上,虚拟终端通过关联串口终端把信息输出到实际的硬件上。
tty架构分析
Linux tty子系统包含:tty核心,tty线路规程和tty驱动。tty核心是对整个tty设备的抽象,对用户提供统一的接口;tty线路规程是对传输数据的格式化;tty驱动则是面向tty设备的硬件驱动。
回溯串口发送流程
回溯是指在最底层逐步返回到最高调用。回溯是在对应的函数中添加dump_stack(),那么在执行该语句时就会把整个函数的调用关系回溯出来。
//tty驱动
[<c018308c>] (s3c24xx_serial_start_tx+0x0/0x64) from [<c017f2ac>] (uart_start+0x68/0x6c)
r5:c3907c02 r4:a0000013
//tty线路规程
[<c017f244>] (uart_start+0x0/0x6c) from [<c017f504>] (uart_flush_chars+0x10/0x14)
r5:c3907c02 r4:00000002
[<c017f4f4>] (uart_flush_chars+0x0/0x14) from [<c016bde8>] (n_tty_write+0x230/0x448)
[<c016bbb8>] (n_tty_write+0x0/0x448) from [<c01693e0>] (tty_write+0x14c/0x244)
//tty核心
[<c0169294>] (tty_write+0x0/0x244) from [<c0169560>] (redirected_tty_write+0x88/0x98)
[<c01694d8>] (redirected_tty_write+0x0/0x98) from [<c009e044>] (vfs_write+0xb4/0xe8)
r9:c39c2000 r8:c00310c8 r7:00000004 r6:c39c3f78 r5:40000000
r4:c3939200