二、TTY子系统框架

news2024/11/24 14:00:31
img
个人主页:董哥聊技术
我是董哥,嵌入式领域新星创作者
创作理念:专注分享高质量嵌入式文章,让大家读有所得!
img

文章目录

    • 1、TTY子系统框架分析
    • 2、TTY数据处理流程
    • 3、驱动的目录结构及核心文件
    • 4、TTY在Linux下的分布

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、驱动的目录结构及核心文件

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驱动的类型。

/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设备相关联的物理设备和驱动程序的位置,它就会创建回这些位置的符号链接。

/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,以便用户空间可以访问。

/dev/tty

/dev/console

/dev/ttyS0

 

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

img

点赞+关注,永远不迷路

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/154552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序使用

微信开发介绍微信公众号的二次开发,主要点后端配置交互,前端负责h5页面微信小程序和微信小游戏的开发,必须要依托于微信,方便宣传开放平台,公众平台小程序介绍2016年出来的,取缔app应用。传统的App应用开发…

Vue中动态展示数据的字典项

问题描述 今天在写自己网站的时候,遇到一个问题,不知道各位前端初学者有没有遇到过这个问题 如图所示:我通过接口查询到一些信息,有两个属性是枚举数据(魔法值) 我们称这种数据为字典项,因为开发中一般称0&#xff…

AWS Markeplace 上的 DolphinDB MGR 快速上手

1. AWS 上的 DolphinDB MGR 简介 DolphinDB MGR 是部署于 Kubernetes 上的 DolphinDB 集群自动运维系统,提供包括部署、升级、扩缩容、配置变更的 DolphinDB 全生命周期管理。通过 DolphinDB MGR,DolphinDB 可以无缝运行在公有云或私有部署的 Kubernete…

openEuler RISC-V 的 Firefox 性能大升级,最高 40 倍性能提升

RISC-V SIG 择日即将发布 openEuler RISC-V 22.03 V2 版本镜像。本次发版会提供带有 SpiderMonkey JIT 编译支持的 Firefox 最新版本和带有 LLVMpipe 优化的 Mesa 最新版本安装源供使用者选装测试,预期图形界面使用性能会获得可观优化。 新版本的 Firefox 开启 JIT…

5.3、UDP 和 TCP 的对比

在使用 TCP/IP 体系结构的网络通信中,这两个协议的使用频率仅次于网际层的 IP 协议 TCP/IP 体系结构应用层中的某些协议需要使用运输层的 TCP 提供的服务 而另一些协议需要使用运输层的 UDP 提供的服务 1、UCP(无连接) & TCP(面向连接) 1.1、UDP 如下所示&am…

小程序:会议OA项目-其它页面

目录 一、tabs组件及会议管理布局 自定义tabs组件 跟着官网来感受一下 会议管理的布局 二、个人中心布局 一、tabs组件及会议管理布局 自定义tabs组件 文档参考:自定义组件 | 微信开放文档 跟着官网来感受一下 先建一个文件夹名为components,里面再建一个tabs的…

【C语言进阶(NEW)】六、文件操作(一)|文件|文件的打开和关闭|文件的顺序读写|文件读取结束的判定

目录 一、文件 1.1 什么是文件 1.1.1 程序文件 1.1.2 数据文件 1.2 为什么使用文件 1.3 文件名 二、文件的打开和关闭 2.1 文件指针 2.2 文件的打开和关闭 三、文件的顺序读写 3.1 fgetc 和 fputc(字符输入输出函数) 3.2 fgets 和 fputs&am…

20行原生JS代码手写ElementUI表格组件

又是许久没有写博客了,这几年的疫情,总是居家,时间久了,慢慢的总会想很多。现在越发觉得想做的事情一定要尽早去做,不然总说等下一次,很多时候,就没有下一次了。 今天给大家分享一下如何用原生…

从0到1完成一个Vue后台管理项目(十七、使用Echarts:柱状图、折线图)

往期 从0到1完成一个Vue后台管理项目(一、创建项目) 从0到1完成一个Vue后台管理项目(二、使用element-ui) 从0到1完成一个Vue后台管理项目(三、使用SCSS/LESS,安装图标库) 从0到1完成一个Vu…

DB性能跟不上,加缓存就够了?

服务端软件开发时,通常会把数据存储在DB。而服务端系统遇到的第一个性能瓶颈,往往发生在访问DB时。 这时大部分开发会拿出“缓存”,通过使用Redis在DB前提供一层缓存数据,缓解DB压力,提升服务端性能。 在数据库前添加…

nohup后台运行,进程查看与终止(ubuntu)

1.nohup用途:不挂断地运行命令。语法:nohup Command [ Arg … ] [ & ]无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohu…

threejs 学习一

前提 threejs官网:https://threejs.org/ 由于官网访问慢,可以github下载压缩包解压后本地启动 github地址:https://github.com/mrdoob/three.js/ 下载好后解压 安装依赖 npm install 启动:npm start 目录介绍: …

语音识别技术简叙述

语音识别技术简述 语音识别的概念 语音识别技术都是让智能设备能够听懂人类语言,其实一门涉及数学信号处理、人工智能、语言学、数理统计学、声学、情感学及心理学等多学科交叉的学科。这项技术可以提供比如自动客服、自动语音翻译、命令控制,语音验证…

【vue】关于vue2和vue3响应式原理的区别

我们都知道,在Vue2中的数据响应式原理存在许多缺陷。 例如无法对新增和直接删除的数据做到响应式,无法直接操作数组进行响应式处理等等。 而在Vue3中,作者很好的解决了这些缺陷,让我们来对比一下Vue2与Vue3对数据响应式处理的具体…

前端如何保证设置的font-family成功生效?

背景 最近开发的一个新页面,在产品验收的时候跟我反馈说页面里的字体跟设计稿中的字体不一样; 问题的关键是我明明记得我有单独设置过 font-family属性,于是我通过Chorme浏览器的调试工具查看了一下DOM的生效样式; 明明是已经设…

IDEA、TortoiseSVN,TortoiseGit提交忽略文件或文件夹

使用IDEA 的SVN插件提交文件是总是会提交一些不需要提交的文件; 我们可以通过一些简单设置忽略这些文件&#xff1a; 1、IDEA 1、idea设置<<--File Types<<--ignore files and folders 原有的过滤条件&#xff1a;*.hprof;*.pyc;*.pyo;*.rbc;*.yarb;*~;.DS_Store…

yolov3-tiny的darknet权重转onnx

前言 之前一直鸽了yolov3-tiny的onnx模型修复&#xff0c;今天终于把最后一个bug解决了&#xff0c;如果想直接享受成果的&#xff0c;直接点我的github仓库下载&#xff0c;使用说明都写了&#xff0c;这篇文章呢主要是给大家分享一下思路和过程&#xff0c;希望能够启发更多…

初识Linux

文章目录初识Linux操作系统概述硬件和软件操作系统常见操作系统总结初识LinuxLinux的诞生Linux内核Linux发行版总结虚拟机介绍虚拟机总结远程连接Linux系统图形化、命令行使用命令行学习Linux系统远程连接工具总结初识Linux 操作系统概述 硬件和软件 我们所熟知的计算机是由…

领域驱动设计:微服务设计为什么要选择DDD?

我们知道&#xff0c;微服务设计过程中往往会面临边界如何划定的问题&#xff0c;我经常看到项目团队为微服务到底应该拆多小而争得面红耳赤。不同的人会根据自己对微服务的理解而拆分出不同的微服务&#xff0c;于是大家各执一词&#xff0c;谁也说服不了谁&#xff0c;都觉得…

Day855.生产者-消费者模式 -Java 并发编程实战

生产者-消费者模式 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于生产者-消费者模式的内容。 Worker Thread 模式类比的是工厂里车间工人的工作模式。 但其实在现实世界&#xff0c;工厂里还有一种流水线的工作模式&#xff0c;类比到编程领域&#xff0c;就是生…