Linux tty子系统分析之一 总体说明

      从本章开始,我们将学习linux tty子系统,tty即为Teletypewritter的缩写,即为电传打印机,即用于人机交互的控制台界面,而cpu与电传打印机之间是通过串口通信的,因此在后来,cpu通过串口与设备进行通信的模块,也就定义了tty子系统(可包括通过串口连接的键盘、通过chunk通信的蓝牙、红外等设备)。现在linux tty子系统包括串口终端、串口设备、usb转串口、虚拟终端、伪终端等等(此处针对tty的描述可能不准确,需要详细了解的童鞋可搜索网络,另外针对linux应用层终端、进程组等之间的关联不再本次专栏之中,本专栏主要专注linux内核子系统的实现及架构说明)。本专栏主要包含如下内容:

一、linux tty子系统总体说明

二、linux tty子系统相关的数据结构及设备抽象说明(包括tty 设备、tty驱动、tty的线路规程的介绍)

三、linux tty驱动、设备、线路规程的注册以及注销接口说明

四、linux 串口子系统总体说明

五、linux串口子系统数据结构及设备抽象说明

六、linux串口子系统设备及端口注册及注销接口说明

七、linux串口控制器驱动开发流程说明

八、linux虚拟串口控制器驱动开发及代码实现

 

本章主要对tty子系统做一个总体说明。主要说明tty子系统内部的划分以及与外部的关联等等。

 

tty子系统框架说明

      下图是简要的tty子系统框架说明。tty设备抽象了字符设备文件节点,用于和具体文件系统关联(之前在介绍文件系统中已经说明过,大多说的文件系统均包含针对字符设备文件节点、块设备文件节点的处理)。

  1. 通过tty字符设备文件节点,即完成了与xxx_fs、vfs的关联,应用层通过vfs接口,即可实现对字符设备文件节点的操作;
  2. tty核心层提供了字符设备文件节点的操作接口(struct file_operations tty_fops),包括tty_open、tty_read、tty_write、tty_poll、tty_ioctl等接口;
  3. 针对tty核心层接口,通过调用线路规程,进行数据的处理(线路规程是linux tty子系统的一个比较好的抽象,针对tty子系统支持10多种线路规程,默认的线路规程为N_TTY,另外支持ppp、slip、Bluetooth、irda等线路规程,实现通过串行传输系统实现具体网络的通信)。针对同一个串行驱动程序,通过调用不同的线路规程,即可实现不同协议的通信操作;
  4. 线路规程的操作接口通过tty_driver的操作接口,实现与串行设备的通信。
  5. 而tty_driver的操作接口,则一般完成与具体的设备的通信,实现串行设备的驱动程序(但针对串口而言,又进行了uart_driver、uart_port的抽象,而uart_port的ops中则实现设备的驱动程序接口(包括读写数据、tx与rx启停控制等接口))

 

Linux tty子系统分析之一 总体说明

 

       以上是简要的说明了vfs、fs、tty之间的关联,以及tty内部各模块的关联等内容。下面从数据结构的关联进一步说明说明tty的框架。

 

tty子系统中数据结构的关联

 

     针对tty子系统,针对设备驱动以及行为进行了抽象,tty_driver是对tty控制器的抽象;而tty_port则是对依附于tty控制器上的tty端口的抽象;而线路规程ldisc我认为可以理解为针对不同协议数据出的的抽象,如要借助于串行设备实现ppp拨号协议的通信,则使用ppp的线路规程的接口进行实现即可;

      下面就是这些数据结构以及tty接口之间的关联,这些关联也印证了上面的关联操作。而tty driver的注册、tty port的注册即是完成下图数据结构间的关联(如在tty driver、tty port的注册,则完成了对应字符设备的注册以及将其对应的设备注册至tty_class中,而在字符设备文件的打开时,则会完成tty_driver、tty_struct、tty_port、tty_ldisc的关联)。

Linux tty子系统分析之一 总体说明

 

tty子系统中接口间的关联

上面介绍了数据结构间的关联,下面我们说明下接口层是如何借助数据结构间的关联,完成接口间的调用关系的。

  1. vfs的系统调用接口,通过字符设备操作接口,最终调用tty字符设备文件节点的操作函数的调用(即tty_open、tty_read、tty_write、tty_poll等接口);
  2. tty_open、tty_read、tty_write、tty_poll等接口,则借助tty_ldisc数据结构类型的变量,调用tty_ldisc_ops中对应的接口;
  3. tty_ldisc_ops中的接口,则借助tty_driver数据结构类型的变量,调用tty_operations数据结构中各成员变量对应的函数指针;
  4. 在tty_operations中的函数指针中,则针对一部分设备驱动,则会调用tty_port中的ops的接口。

 

Linux tty子系统分析之一 总体说明

 

 

      本文主要是对tty子系统的架构从数据结构之间的关联、接口调用关系进行简要说明,后续章节中则对数据结构、注册函数、接口调用进行详细的说明。