[Linux 基础] -- Linux TTY Framework(2)_软件架构

一、前言

由 “Linux TTY Framework(1)_基本概念” 的介绍可知,在 Linux kernel 中,TTY 就是各类终端(Terminal)的简称。为了简化终端的使用,以及终端驱动程序的编写,Linux kernel 抽象出了 TTY framework;对上,向应用程序提供使用终端的统一接口;对下,提供编写终端驱动程序(如 serial driver)的统一框架。

本文是 Linux Framework 分析的第二篇文章将从整体架构的角度,介绍 Linux TTY framework,以便分解出功能相对独立的子模块,以便后续的分析。

二、软件架构

Linux kernel TTY Framework 位于 “drivers/tty” 目录中,其软件架构如下面图片1所示:

和 Linux 其它的 Framework 类似,TTY Framework 通过 TTY core 屏蔽 TTY 有关的技术细节,对上以字符设备的形式向应用程序提供统一接口,对下以 TTY device/TTY driver 的形式提供驱动程序的编写框架。具体请参考后续章节介绍。

2.1、TTY core

TTY core 是 TTY Framework 的核心逻辑,功能包括:

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                  同上
…                         …                                             …
(x, x)                     /dev/ttyS0                                 串口终端(名称和设备号由驱动自行决定)
…                         …                                             …
(x, x)                     /dev/ttyUSB0                            USB转串口终端
…                         …                                             …

注1:控制终端、控制台终端、虚拟终端等概念,比较抽象,我会在后续的文章中详细介绍

2)通过设备模型中的 struct device 结构抽象 TTY 设备,并通过 struct tty_driver 抽象该设备的驱动,并提供相应的 register 接口。TTY 驱动程序的编写,简化为填充并注册相应的 struct tty_driver 结构

注2:TTY Framework 弱化了 TTY 设备(图片1中使用虚线框标注)的概念,通常情况下,可以在注册 TTY 驱动的时候,自动分配并注册 TTY 设备

3)使用 struct tty_struct、struct tty_port 等数据结构,从逻辑上抽象 TTY 设备及其 “组件”,以实现硬件无关的逻辑

4)抽象出名称为线路规程(Line Discipines)的模块,在向 TTY 硬件发送数据之前,以及从 TTY 设备接收数据之后,进行相应的处理(如特殊字符的转换等)

2.2、System Console Core

Linux kernel 的 system console 主要有两个功能:

1)向系统提供控制台终端(console Terminal),以便让用户登录进行交互操作;

2)提供 printk 功能,以便 kernel 代码进行日志输出。

2.3、TTY Line Discipilines

线路规程(Line Disciplines) 在 TTY Framework 中是一个非常优雅的设计,我们可以把它看成设备驱动和应用接口之间的一个适配层。从字面意思理解,就是辅助 TTY driver,将我们通过 TTY 设备键入的字符转换成一行一行的数据,当然,实际情况远比这复杂,例如在蜗窝 x project 所使用的 kernel 版本中国,存在如下的 Line Disciplines(以 n_ 为前缀,我们后续的文章会更为详细的介绍):

pengo@DESKTOP-CH8SB7C:~/work/xprj/linux$ ls drivers/tty/n_*
drivers/tty/n_gsm.c   drivers/tty/n_r3964.c        drivers/tty/n_tracesink.c  drivers/tty/n_tty.c
drivers/tty/n_hdlc.c  drivers/tty/n_tracerouter.c  drivers/tty/n_tracesink.h

2.4、TTY Drivers 以及 System Console Drivers

最后,对内核以及驱动工程师来说,更关注的还是具体的 TTY 设备驱动。在 kernel 为我们搭建的如此 beauty 框架下面,编写相应的 driver 就成为一件比较简单的事情了。当然的 kernel 中,主要的 TTY driver 有两类:

1)虚拟终端(Virtual Terminal,VT)驱动,位于 drivers/tty/vt 中,负责实现 VT(后续文章会详细介绍)有关的功能;

2)串口终端驱动,也即我们所熟知的 serial subsystem(话说终于到重点了,哈哈),位于 drivers/tty/serial 中。

三、总结

本文对 Linux TTY Framework 的软件框架作了一个简单的介绍,目的是从整体上了解 Linux TTY 有关的软件实现。基于本文的描述,后续计划从如下角度继续 TTY Framework 的分析:

控制终端、控制台终端、虚拟终端等概念的理解及解释;

TTY core 的分析;

System Console Core 的分析;

Serial subsystem (串口子系统)的分析;

虚拟终端(VT)的分析;

常用线路规程(Line Disciplines)的介绍和分析;

等等。

四、参考文档

[1] TTY驱动分析

[2] 控制终端(controlling terminal),https://linux.die.net/man/4/tty

[3] https://utcc.utoronto.ca/~cks/space/blog/unix/TTYLineDisciplineWhy

 

本文转自:蜗窝科技www.wowotech.net

 

猜你喜欢

转载自blog.csdn.net/u014674293/article/details/115296095