接前一篇文章:Linux内核TTY子系统有什么(6)
本文内容参考:
一文彻底讲清Linux tty子系统架构及编程实例-优快云博客
linux TTY子系统(3) - tty driver_sys tty device driver-优快云博客
Linux TTY 子系统框架_linux tty体系-优快云博客
Linux TTY Driver_tty driver配置-优快云博客
特此致谢!
二、TTY子系统框架
在Linux内核中,TTY子系统位于Linux内核源码(linux-6.1.10)/drivers/tty/下:
tty目录中的内容如下:
TTY的总体框架(Framework)如下:
由上往下依次对各层进行说明:
- 应用层(Application)
应用层位于用户空间(User Space)。在用户空间,操作TTY的方法就是系统调用open、read、write、ioctl、close(release)等操作设备文件(如/dev/tty、/dev/console等)。
注意:以下各层就进入内核空间(Kernel Space)了。
- 字符设备驱动(Char Device Driver)
以字符设备驱动的形式,向应用程序提供统一接口open、read、write、ioctl、release等,以便输入输出数据。
- TTY核心(TTY Core)
TTY Core是TTY框架的核心,是对整个TTY设备的抽象,对用户提供统一的接口。TTY核心层功能包括:
1)以字符设备的形式,向用户空间提供访问TTY设备的接口。
设备号(主, 次) 字符设备 备注
(5, 0) /dev/tty 控制终端(Controlling Terminal)
(5, 1) /dev/console 控制台终端(Console Terminal)
(4, 0) /dev/vc/0 or /dev/tty0 虚拟终端(Virtual Terminal)
(4, 1) /dev/vc/1 or /dev/tty1 虚拟终端(Virtual Terminal)
… … …
(x, x) /dev/ttyS0 串口终端(名称和设备号由驱动自行决定)
… … …
(x, x) /dev/ttyUSB0 USB转串口终端
… … …
2)通过设备模型中的struct device结构抽象TTY设备,并通过struct tty_driver抽象该设备的驱动,并提供相应的register接口。TTY驱动程序的编写,简化为填充并注册相应的struct tty_driver结构。
3)使用struct tty_struct、struct tty_port等数据结构,从逻辑上抽象TTY设备及其“组件”,以实现硬件无关的逻辑。
4)抽象出名称为线路规程(Line Disciplines)的模块,在向TTY硬件发送数据之前,以及从TTY设备接收数据之后,进行相应的处理(如特殊字符的转换等)。
- 系统控制台核心(System Console Core)
在Linux内核中,系统控制台(System Core)主要有两个功能:
1)显示内核信息。
2)与用户进行交互。
- 线路规程(TTY Line Discipline)
线路规程以特殊的方式对数据进行二次加工,通常表现为协议的转换,对传输数据的格式化,以便可以虚拟的“插入”到任何TTY设备。
- TTY Drivers及System Console Drivers
该层主要用于实现各类终端的驱动,用以控制实际硬件设备、收发数据。其有3种不通类型的驱动:控制台,串口,pty。其中,控制台和 pty 驱动已经被编写进内核。
更多内容请看下回。