TTY驱动程序架构:
1. TTY概念解析
1.1 /dev/ttySCA0
1.2 /dev/tty1-n
1.3 /dev/console
在linux系统中,终端是一类字符型设备,它包括多种类型,通常使用tty来简称各种类型的终端设备。
. 串口终端(/dev/ttyS*)
串口终端是使用计算机串口连接的终端设备。Linux把每个串行端口都看做是一个字符设备。这些串行端口所对应的设备名称是/dev/ttySAC*;
.控制台终端(/dev/console)
在Linux系统中,计算机的输出设备通常被称为控制台终端,这里特指printk信息输出到设备。/dev/console是一个虚拟的设备,它需要映射到真正的tty上,比如通过内核启动参数“console=ttySCA0”就把console映射到了串口0
. 虚拟终端(、dev/tty*)
当用户登录时,使用的是虚拟终端。使用Ctcl+Alt[F1 - F6]组合键时,我们就可以切换到tty1、tty2、tty3等上面去。tty*就称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名。
2. TTY架构分析
下面来通过一个回溯功能从内核代码来印证上面一张图的tty架构各函数调用关系!
第一红色箭头对应的函数就是上图中的driver_write()
上图中第二个红色箭头部分:在该函数处加上一个dump_stack函数保存然后重新编译内核
通过tftp下载到开发板启动内核会看到串口终端打印出这个函数调用的回溯信息!
今天电脑难产了!编译内核用了好久,之前几分钟就搞定了!
开发板启动内核然后dmesg命令查看回溯打印的信息(这里为什么没直接打印到串口要用dmesg和printk打印级别有关)
这里打印的比较多,仔细看其实都是重复的这里我里面的一段复制粘贴下来:
[] (dump_stack+0x18/0x1c) from [] (s3c24xx_serial_start_tx+0x14/0xb4)
[] (s3c24xx_serial_start_tx+0x14/0xb4) from [] (uart_start+0x64/0x68)
[] (uart_start+0x64/0x68) from [] (uart_write+0xc0/0xe4)
[] (uart_write+0xc0/0xe4) from [] (do_output_char+0x16c/0x1d8)
[] (do_output_char+0x16c/0x1d8) from [] (process_output+0x38/0x54)
[] (process_output+0x38/0x54) from [] (n_tty_write+0x204/0x444)
[] (n_tty_write+0x204/0x444) from [] (tty_write+0x14c/0x244)
[] (tty_write+0x14c/0x244) from [] (redirected_tty_write+0x58/0x68)
[] (redirected_tty_write+0x58/0x68) from [] (vfs_write+0xbc/0x150)
[] (vfs_write+0xbc/0x150) from [] (sys_write+0x44/0x74)
[] (sys_write+0x44/0x74) from [] (ret_fast_syscall+0x0/0x30)