一文了解TTY子系统框架

2023-01-18 15:14:12 浏览数 (1)

二、TTY子系统框架

1、TTY子系统框架分析

该篇主要用来分析TTY子系统的框架,TTY框架图如下:

image-20221231220853840

TTY子系统位于标准字符驱动之下,其中包括:TTY核心层,TTY线路规程,TTY驱动层。

TTY Core:该核心层主要负责控制跨越一个tty设备的数据流和数据格式,使得TTY Driver能够以一致的方式处理 到硬件出自硬件 的数据。

TTY Line Discipline:线路规程,以特殊的方式对数据进行二次加工,通常表现为协议的转换,如:PPPBluetooth,以便可以虚拟的“插入”到任何tty设备。

TTY Driver:该层主要用于实现各类终端的驱动,用以控制实际硬件设备,用于收发数据。其有3种不通类型的驱动:**控制台,串口,pty**。其中,控制台和 pty 驱动已经被编写进内核。

下面是在网上的另一个TTY框架图,结合上图更加方便理解

image-20221021212536798

从上往下看,最上面是应用层,其次是字符设备驱动,然后是TTY核心层,TTY驱动层。

其中,

用户层:在用户空间,我们操作TTY的方法就是通过openreadwrite读写设备文件,如:/dev/tty/dev/console

通用字符设备驱动:对上,以字符设备驱动的形式,向应用程序提供统一接口open, read, write,以便输入输出数据

System Console Core:其主要有两个功能:

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

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

System console core模块使用struct console结构抽象system console功能,具体的driver不需要关心console的内部逻辑,填充该接口并注册给kernel即可。

2、TTY数据处理流程

  • tty 核心从一个用户获取将要发送给一个 tty 设备的数据. 它接着传递它到一个 tty 线路规程驱动, 接着传递它到一个 tty 驱动. 这个 tty 驱动转换数据为可以发送给硬件的格式.
  • 从 tty 硬件收到的数据向上回流通过 tty 驱动, 进入 tty 线路规程驱动, 再进入 tty 核心, 在这里它被一个用户获取.
  • 有时 tty 驱动直接和 tty 核心通讯, 并且 tty 核心直接发送数据到tty 驱动, 但是大多数情况下 tty 线路规程有机会修改在 2 者之间发送的数据.

3、驱动的目录结构及核心文件

代码语言:javascript复制
ketnel
│   └── driver
│   │   └── tty
│   │   │   └── serial  # 串口终端驱动  
│   │   │   │   └── 8250
│   │   │   │ │   ├── 8250_core.c  # 8250 串口核心层   
│   │   │   │ │   ├── 8250_port.c  # 8250 串口port抽象
│   │   │   │ │   ├── 8250_dma.c  # 8250 dma驱动
│   │   │   │ │   ├── 8250_dw.c  # 8250 device driver抽象 
│   │   │ └── vt   # 虚拟终端驱动
│   │   │ └── ipwireless # 无线终端驱动
│   │   │ └── hvc   # 虚拟控制台
│   │   │ ├── tty_xxx  #tty driver port 抽象
│   │   │ ├── n_xxx.c  # tty line discipline 线路规程相关文件

serial:该目录下为串口终端的驱动程序

hvc:hypervisor虚拟控制台

vt:目录下为虚拟终端的驱动程序

n_xxx.c:为线路规程的相关文件,也就是串口数据处理

tty_xxx:包括字符设备驱动的实现,ioctl

8250_xxx:为serial Driver

4、TTY在Linux下的分布

TTY是所有终端的统称,对于不同的终端,我们有不同的驱动程序,那么我们怎么知道当前系统中,哪个驱动被加载,哪个终端设备存在呢?

  • 查看所有终端

可以查看/proc/tty/drivers文件,这个文件可以包含当前存在的,不同tty驱动的列表,驱动的名字,驱动的主编号,次编号范围,tty驱动的类型。

代码语言:javascript复制
/dev/tty             /dev/tty        5       0 system:/dev/tty
/dev/console         /dev/console    5       1 system:console
/dev/ptmx            /dev/ptmx       5       2 system
/dev/vc/0            /dev/vc/0       4       0 system:vtmaster
usbserial            /dev/ttyUSB   188   0-254 serial
serial               /dev/ttyS       4   64-67 serial
pty_slave            /dev/pts      136   0-255 pty:slave
pty_master           /dev/ptm      128   0-255 pty:master
pty_slave            /dev/ttyp       3   0-255 pty:slave
pty_master           /dev/pty        2   0-255 pty:master
unknown              /dev/tty        4    1-63 console
  • 设备模型的角度

所有当前注册的以及在内核中出现的tty设备,有他们自己的子目录 /sys/class/tty下面。

在他们tty设备的子目录下面的文件夹中,有一个dev文件,包含了分配给tty设备的主次编号。 如果驱动程序告诉内核与tty设备相关联的物理设备和驱动程序的位置,它就会创建回这些位置的符号链接。

代码语言:javascript复制
/sys/class/tty/
|-- console
|   `-- dev
|-- ptmx
|   `-- dev
|-- tty
|   `-- dev
|-- tty0
|   `-- dev
   ... 
|-- ttyS1
|   `-- dev
|-- ttyS2
|   `-- dev
|-- ttyS3
|   `-- dev
   ...
|-- ttyUSB0
|   |-- dev
|   |-- device -> ../../../devices/pci0000:00/0000:00:09.0/usb3/3-1/3-1:1.0/ttyUSB0
|   `-- driver -> ../../../bus/usb-serial/drivers/keyspan_4
|-- ttyUSB1
|   |-- dev
|   |-- device -> ../../../devices/pci0000:00/0000:00:09.0/usb3/3-1/3-1:1.0/ttyUSB1
|   `-- driver -> ../../../bus/usb-serial/drivers/keyspan_4
|-- ttyUSB2
|   |-- dev
|   |-- device -> ../../../devices/pci0000:00/0000:00:09.0/usb3/3-1/3-1:1.0/ttyUSB2
|   `-- driver -> ../../../bus/usb-serial/drivers/keyspan_4
`-- ttyUSB3
    |-- dev
    |-- device -> ../../../devices/pci0000:00/0000:00:09.0/usb3/3-1/3-1:1.0/ttyUSB3
    `-- driver -> ../../../bus/usb-serial/drivers/keyspan_4
  • 字符设备的角度

每个tty设备都有一个struct cdev,以便用户空间可以访问。

代码语言:javascript复制
/dev/tty

/dev/console

/dev/ttyS0

OK,TTY子系统框架以及目录结构分析就先了解到此,后续分析其主要的数据结构!

0 人点赞