串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。
有段时间这些串行端口设备通常被称为终端设备,因为 那时它的最大用途就是用来连接终端。这些串行端口所对应的设备名称是/dev/tts/0
(或/dev/ttyS0
)、/dev/tts/1
(或/dev /ttyS1
)等,设备号分别是(4,0)、(4,1)等,分别对应于DOS系统下的COM1、COM2等。
若要向一个端口发送数据,可以在命令行上把标 准输出重定向到这些特殊文件名上即可。例如,在命令行提示符下键入:echo test > /dev/ttyS1
会把单词”test”发送到连接在ttyS1(COM2)端口的设备上。
伪终端 /dev/pts
是远程登陆(telnet,ssh等)后创建的控制台设备文件所在的目录。
由于可能有好几千个用户登陆,所以/dev/pts
其实是动态生成的,不象其他设备文件是构建系统时就已经产生的硬盘节点(如果未使用devfs) 。
第一个用户登陆,console的设备文件为/dev/pts/0
,第二个为/dev/pts/1
,以此类推。这里的0、1、2、3不是具体的标准输入或输出,而是整个控制台。你可尝试 echo "aaaaaa" > /dev/pts0、1、2……
。
控制终端 /dev/tty
指的是当前所处的终端,输出到此的内容只会显示在当前工作的终端显示器上。
如果当前进程有控制终端(Controlling Terminal)的话,那么/dev/tty就是当前进程的控制终端的设备特殊文件。可以使用命令”ps –ax”来查看进程与哪个控制终端相连。对于你登录的shell,/dev/tty
就是你使用的终端,设备号是(5,0)。
使用命令”tty”可以查看它具体对应哪个实际终端设备。/dev/tty
有些类似于到实际所使用终端设备的一个联接。这个终端文件可以由各个用户共享
控制台终端/dev/ttyn
n(0到6), tty1,tty2就是不同的虚拟终端(virtual console).
/dev/console
就是tty0 ,tty0则是当前所使用虚拟终端即激活的虚拟终端的一个别名,系统所产生的信息会发送到该终端上,实际上机器只有一个屏幕,也就是我们看到的这个屏幕,可以理解为console指向激活的那个tty,准确地说是激活的那个tty才将输出显示到console。
历史上,console指主机本身的屏幕键盘,而tty指用电缆链接的其它位置的控制台(仅包含屏幕和键盘)。tty0是系统自动打开的,但不用于用户登录。
其实,上古时期,都有实体,理解完全不是难事。
这个IBM的广告,美女左手是terminal,右手是console
实体terminal时代的逻辑流程图如下:
到了PC时代,本机自带了键盘鼠标,于是混乱就开始了
来看一张图,其实会解决这个混乱
现代tty架构
串口驱动,内核启动的时候,便初始化完成,后期应用层用到的时候,访问设备节点便,获取串口设备的 fd 句柄,然后设置相关的参数(波特率,停止位,校验位等等)便可以使用串口进行数据收发。
Linux Kernel 的 UART 串口分为几层,tty 核心层,tty 线路规程,串行驱动核心层,以及下面对接具体芯片的 ops:
整个流程走下来,有太多的数据结构和 ops,要分析清楚整个流程,有两种方式:
1、至上而下,即,从用户空间调用串口配置以及串口读写的角度来分析
2、从底层注册开始分析
本文先从底层注册开始分析,根据内核已知提供的接口,逐步打开魔盒,力求扩散到每一个常用的地方。
tty core主要实现如下三类功能:
负责在串口设备之间进行上下文切换,以实现多任务调度。当有数据需要从串口设备发送或接收时,线程调度器会将任务切换到适当的设备上。
这个层次主要负责和具体的串口硬件进行通信,实现了对硬件的控制和访问。在内核中,串口驱动模块通常被实现为字符设备,通过字符设备接口与串口核心模块进行交互。它通过注册到串口核心层,实现了对上层的透明。
tty core
和串口硬件驱动层是串口驱动框架的核心部分。在使用串口设备时,用户通常只需要与tty core
模块进行交互,而不需要直接操作串口驱动模块和平台驱动模块。下一节我们将深入到串口驱动内部分析tty core
的框架体系结构。
https://blog.csdn.net/liusaoyue/article/details/5075745
https://www.zhihu.com/question/21711307?sort=created
https://blog.csdn.net/awks4002/article/details/102360209
end