UART驱动学习二(TTY体系)

目录

  • 一、TTY体系中设备节点的差别
    • 1. 傻傻分不清 /dev/tty*
    • 2. 要讲历史了
      • 2.1 电传机teletype
      • 2.2 计算机需要控制
        • 2.2.1 使用teletype
        • 2.2.2 teletype被淘汰了
        • 2.2.3 个人电脑和虚拟终端
    • 3. tty相关设备节点
      • 3.1 各类设备节点的差别
      • 3.2 /dev/ttyN(N=1,2,3,..., 63)
      • 3.3 /dev/tty0
      • 3.4 /dev/tty
      • 3.5 串口终端ttyS*
      • 3.6 伪终端
      • 3.7 Terminal和Console的差别
      • 3.8 /dev/console
  • 二、TTY驱动框架
    • 1. 行规程的引入
    • 2. TTY驱动程序框架(kernel/drivers/tty)
      • 2.1 核心文件
      • 2.2 `hvc` 目录
      • 2.3 `ipwireless` 目录
      • 2.4 `serdev` 目录
      • 2.5 `serial` 目录
      • 2.6 `vt` 目录
  • 三、参考资料(==必读==)

一、TTY体系中设备节点的差别

1. 傻傻分不清 /dev/tty*

  /dev/ttyS0、/dev/ttySAC0、/dev/tty、/dev/tty0、/dev/tty1、/dev/console,它们有什么差别?

设备节点含义
/dev/ttyS0、/dev/ttySAC0串口
/dev/tty1、/dev/tty2、/dev/tty3、……虚拟终端设备节点
/dev/tty0前台终端
/dev/tty程序自己的终端,可能是串口、也可能是虚拟终端
/dev/console控制台,又内核的cmdline参数确定

  TTY/Terminal/Console/UART,它们有什么差别?

术语含义
TTY来自teletype,最古老的输入输出设备,现在用来表示内核的一套驱动系统
Terminal终端,暗含远端之意,也是一个输入输出设备,可能是真实设备,也可能是虚拟设备
Console控制台,含控制之意,也是一种Terminal,权限更大,可以查看内核打印信息
UART串口,它的驱动程序包含在TTY驱动体系之内

2. 要讲历史了

2.1 电传机teletype

  teletype电传打字机,更准确地说是teleprinter,是一种通信设备,可以用来发送、接收文本信息。
  teletype是一家公司的名字,它生产的teleprinter实在太有名,结果公司名变成了这类产品的名字:teleprinter都被称为teletype了。teletype被用来传输商业电报,想像一下:
在这里插入图片描述

  • 把两台teletype的线缆接在一起,或者使用无线技术连接两台teletype
  • 这边打字,另一边就可以接收到信息并通过纸张打印出来
  • 注意:这两台teletype可以离得很远

2.2 计算机需要控制

2.2.1 使用teletype

  teletype的简称就是TTY。最古老的计算机支持的是批处理模型:

  • 怎么编程?卡片打孔,然后喂给计算机。
  • 怎么得到输出信息?计算机根据结果在卡片上打孔,需要专人翻译这些卡片。

  如果把两台teletype的其中一台,替换为计算机,不就更方便了吗?可以即时输入指令、即时看到结果。于是teletype变成了计算机的终端、Terminal,远端之意。teletype和计算机可以放在一个房间里,也可以放在很远很远的地方。
在这里插入图片描述
  teletype是通过串口(UART)跟计算机相连的:
在这里插入图片描述
  那时计算机很贵,发展出多用户系统,多个用户可以分时使用计算机,降低成本:
在这里插入图片描述

2.2.2 teletype被淘汰了

1960年代,CRT显示器+键盘,替代了teletype:

  • 显示器替代了纸张
  • 速度更快
  • 成本更低
  • 它仍然只是一个终端(terminal),通过线缆连接到计算机
  • 虽然不再是teletype,但是它的驱动程序仍然叫做TTY
    在这里插入图片描述
2.2.3 个人电脑和虚拟终端

  上图长得像电脑,但是它只是一个终端,它要连接到计算机才能工作。这才是电脑:计算单元(CPU、硬盘、内存等等)、终端(键盘、显示器)都齐全了:
在这里插入图片描述
  终端硬件上只有一套键盘、显示器。但是在Linux系统中,我们可以打开多个命令行程序(也叫terminal、shell),每个程序都对应一个"虚拟终端"。

3. tty相关设备节点

3.1 各类设备节点的差别

  由于历史原因,下图中两条红线之内的代码被称为TTY子系统。它既支持UART,也支持键盘、显示器,还支持更复杂的功能(比如伪终端)。
在这里插入图片描述

3.2 /dev/ttyN(N=1,2,3,…, 63)

  /dev/tty3、/dev/tty4:表示某个程序使用的虚拟终端

// 在tty3、tty4终端来回切换,执行命令
echo hello > /dev/tty3
echo hi    > /dev/tty4

  在Linux中,/dev/ttyN代表的都是上述的物理终端,其中,/dev/tty1~/dev/tty63代表的是本地终端,也就是接到本机的键盘显示器可以操作的终端。换句话说,你往/dev/tty3里写个东西,它就会显示在显示器对应的终端。

  为什么会有63个终端这么多呢?毕竟显示器只是一个单独的显示设备,键盘往往也只有一个,但Linux内核有能力知道现在该干什么,所以事实上Linux内核在初始化时会生成63个本地终端,通过键盘上的Fn-Alt-FX(X为1,2,3…)可以在这些终端之间切换,每切换到一个终端,该终端就是当前的焦点终端,比如说,你按下了Fn-Alt-F4组合键,那么此时第4个终端就是焦点终端,即/dev/tty4就是焦点终端设备。

3.3 /dev/tty0

  /dev/tty0:表示前台程序的虚拟终端

  • 你正在操作的界面,就是前台程序
  • 其他后台程序访问/dev/tty0的话,就是访问前台程序的终端,切换前台程序时,/dev/tty0是变化的
    // 1. 在tty3终端执行如下命令
    // 2. 然后在tty3、tty4来回切换while [ 1 ]; do echo msg_from_tty3 > /dev/tty0; sleep 5; done
    

3.4 /dev/tty

  /dev/tty表示本程序的终端,可能是虚拟终端,也可能是真实的中断。程序A在前台、后台间切换,它自己的/dev/tty都不会变。

// 1. 在tty3终端执行如下命令
// 2. 然后在tty3、tty4来回切换while [ 1 ]; do echo msg_from_tty3 > /dev/tty; sleep 5; done

3.5 串口终端ttyS*

  以ttyS开头的就是串口连接的终端,比如ttyS1,ttyS2…

3.6 伪终端

  伪终端(pseudo-terminal,简称 PTY)是在Unix和Linux系统中用于模拟真实物理终端的一种机制。它允许程序像与真实终端交互一样与用户或其他进程进行通信,但实际上并不依赖物理设备。以下是关于伪终端及其设备文件的详细解释:

伪终端的工作原理: 伪终端系统主要分为两部分

  1. 主设备(master device)

    • 通常表示为 /dev/ptmx/dev/ptm
    • 应用程序通过此设备与伪终端进行交互,接收和发送数据。
    • 当一个进程打开 /dev/ptmx 文件时,会获得一个新的伪终端主设备文件描述符,并自动在 /dev/pts/ 目录下创建一个新的从设备文件。
  2. 从设备(slave device)

    • 表示为 /dev/pts/N,其中 N 是一个数字,代表伪终端的编号。
    • 提供与真实终端相同的接口,但没有物理硬件依赖。
    • 具有标准输入、标准输出和标准错误输出等功能。

伪终端的使用场景:

  • 远程连接:如通过 SSH、Telnet 等协议进行的远程会话。
  • 窗口管理器中的终端模拟:如 GNOME Terminal、Konsole 等图形终端模拟器。
  • 脚本自动交互:用于自动化测试、批量操作等场景。

伪终端设备文件详解:

  1. /dev/ptmx

    • 是伪终端系统的主设备文件。
    • 用于创建一个新的伪终端对(主设备和从设备)。
    • 通过打开此文件并调用相应的系统调用(如 ioctl),可以获取与从设备相关的文件描述符和信息。通过 ioctl 系统调用和 TIOCGPTN 命令获取从设备的编号。
  2. /dev/pts/N

    • 是伪终端系统的从设备文件。
    • 每个从设备文件对应一个唯一的伪终端编号 N。
    • 提供与真实终端相似的接口,允许用户或其他进程进行输入/输出操作。

3.7 Terminal和Console的差别

  Terminal含有远端的意思,中文为:终端。Console翻译为控制台,可以理解为权限更大、能查看更多信息。比如我们可以在Console上看到内核的打印信息,从这个角度上看:

  • Console是某一个Terminal
  • Terminal并不都是Console。
  • 我们可以从多个Terminal中选择某一个作为Console
  • 很多时候,两个概念混用,并无明确的、官方的定义

3.8 /dev/console

  选哪个?内核的打印信息从哪个设备上显示出来?可以通过内核的cmdline来指定,比如: console=ttyS0 console=tty,可通过该命令查看cmdline:cat /proc/cmdline

  我不想去分辨这个设备是串口还是虚拟终端,有没有办法得到这个设备?有!通过/dev/console!

console=ttyS0时:/dev/console 就是ttyS0
console=tty时:/dev/console 就是前台程序的虚拟终端
console=tty0时:/dev/console 就是前台程序的虚拟终端
console=ttyN时:/dev/console 就是/dev/ttyN
console有多个取值时,使用最后一个取值来判断

不管你在哪里往/dev/console里写东西,这些东西总会出现在系统当前的焦点终端上!

二、TTY驱动框架

1. 行规程的引入

在这里插入图片描述
以下文字引用自参考资料解密TTY

  大多数用户都会在输入时犯错,所以退格键会很有用。这当然可以由应用程序本身来实现,但是根据UNIX设计“哲学”,应用程序应尽可能保持简单。为了方便起见,操作系统提供了一个编辑缓冲区和一些基本的编辑命令(退格,清除单个单词,清除行,重新打印),这些命令在行规范(line discipline)内默认启用。高级应用程序可以通过将行规范设置为原始模式(raw mode)而不是默认的成熟或准则模式(cooked and canonical)来禁用这些功能。

  大多数交互程序(编辑器,邮件客户端,shell,及所有依赖curses或readline的程序)均以原始模式运行,并自行处理所有的行编辑命令。行规范还包含字符回显和回车换行(译者注:\r\n 和 \n)间自动转换的选项。如果你喜欢,可以把它看作是一个原始的内核级sed(1)。

  另外,内核提供了几种不同的行规范。一次只能将其中一个连接到给定的串行设备。行规范的默认规则称为N_TTY(drivers/char/n_tty.c,如果你想继续探索的话)。其他的规则被用于其他目的,例如管理数据包交换(ppp,IrDA,串行鼠标)。

2. TTY驱动程序框架(kernel/drivers/tty)

在这里插入图片描述

2.1 核心文件

  1. tty_io.c

    • 这是TTY设备核心的实现文件,包含了TTY设备的输入输出操作、读写函数等。
    • 管理字符的输入输出流,处理字符设备的基本功能,如读取、写入、控制信号等。
  2. tty_buffer.c

    • 提供对TTY缓冲区的管理功能。
    • 实现输入和输出缓冲区的操作,如字符的存储、读取和清空。
  3. tty_ldisc.c

    • 实现行规程的核心逻辑,管理不同的行规程(如N_TTY、N_PPP等)。
    • 负责行规程的切换和设置,处理输入数据的解析和输出的格式化。
  4. pty.c

    • 实现伪终端的相关功能,包括伪终端的操作和管理。
    • 允许创建一对主从终端,使用户可以在应用程序和Shell之间进行交互。

  在 /drivers/tty 下,行规程是TTY系统的重要组成部分。行规程定义了输入输出数据的处理方式,可以通过 tty_ldisc.c 进行管理。每种行规程都要实现特定的回调函数,以用于处理数据的读取、写入和设置操作。

  TTY设备通常由字符设备驱动支持,用户空间进程通过与TTY接口交互来执行输入输出操作。

  • 使用标准库函数(如 read()write()ioctl() 等)与TTY设备进行交互。
  • TTY设备驱动将用户空间的请求转化为内核空间的设备操作。

2.2 hvc 目录

  hvc 目录包含了 Hypervisor Console(HVC)设备的驱动程序。HVC是一种虚拟机监视器(VMM)提供的虚拟控制台接口,允许虚拟机与主机进行通信。

  • hvc_console.c

    • 实现HVC设备的控制台功能。
    • 支持虚拟机与主机之间的输入输出操作。
    • 处理HVC设备的初始化、打开、关闭和读写操作。
  • hvc_irq.c

    • 处理HVC设备的IRQ(中断请求)。
    • 实现中断服务例程(ISR),确保HVC设备及时响应中断事件。
  • hvc_vio.c

    • 提供与IBM PowerVM虚拟I/O(vio)设备相关的HVC支持。
    • 处理vio设备的初始化和操作。
  • hvc_xen.c

    • 提供与Xen虚拟化平台相关的HVC支持。
    • 处理Xen虚拟机与主机之间的控制台通信。

2.3 ipwireless 目录

  ipwireless 目录包含了支持IPWireless无线数据卡的TTY驱动程序。IPWireless是一种用于移动宽带连接的无线数据卡。

  • 实现IPWireless设备的TTY接口。
  • 处理设备的初始化、打开、关闭、读写和控制操作。
  • 支持IPWireless设备的AT命令接口。

2.4 serdev 目录

  serdev 目录包含了Serial Device Bus(serdev)框架的实现。serdev是一种用于管理串行设备的框架,允许不同的串行设备通过统一的接口进行操作。

  • core.c

    • 实现serdev总线的核心功能。
    • 管理serdev设备的注册、连接和断开。
    • 提供设备的操作函数,如读取、写入和控制。
  • serdev-ttyport.c

    • 实现通过TTY端口连接的serdev设备。
    • 支持TTY端口的操作和配置。

2.5 serial 目录

serial 目录包含了传统的串行端口(如UART)驱动的实现。

  • 8250 子目录

    • 实现8250兼容UART的驱动程序。
    • 支持多种平台和架构上的串行端口操作。
  • earlycon.c

    • 实现早期控制台(earlycon),用于内核启动阶段的输出。
    • 支持早期调试信息的输出。
  • serial_core.c

    • 实现串行端口的核心功能。
    • 管理串行端口的初始化、配置、读写和控制操作。

2.6 vt 目录

vt 目录包含了虚拟终端(Virtual Terminal,VT)的实现,VT是一种用于模拟物理终端的软件实现。

  • vt.c

    • 实现虚拟终端的核心功能。
    • 管理虚拟终端的输入输出操作,支持多虚拟终端的切换和配置。
  • keyboard.c

    • 实现虚拟终端键盘的处理。
    • 处理键盘输入事件,转换为字符数据。
  • selection.c

    • 实现虚拟终端的文本选择功能。
    • 处理终端文本的选择、复制和粘贴操作。
  • vc_screen.c

    • 实现虚拟终端的屏幕管理。
    • 处理终端屏幕的绘制和刷新操作。

三、参考资料(必读

  • 解密TTY
  • 彻底理解Linux的各种终端类型以及概念
  • Linux终端和Line discipline图解
  • What Are Teletypes, and Why Were They Used with Computers?

  本文章参考了韦东山老师驱动大全部分笔记,其余内容为自己整理总结而来。水平有限,欢迎各位在评论区指导交流!!!😁😁😁

  未完待续哦

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

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

相关文章

C语言入门指南:为大一新生准备

C语言入门指南:为大一新生准备 C语言是许多编程语言的基础,许多现代编程语言(如C、Java、Rust等)都从C语言中汲取了灵感。因此,学习C语言不仅能帮助你掌握编程的基本概念,还能为学习其他编程语言打下坚实的…

Android一个APP里面最少有几个线程

Android一个APP里面最少有几个线程 参考 https://www.jianshu.com/p/92bff8d6282f https://www.jianshu.com/p/8a820d93c6aa 线程查看 Android一个进程里面最少包含5个线程,分别为: main线程(主线程)FinalizerDaemon线程 终结者守护线程…

详解正确创建好SpringBoot项目后但是找不到Maven的问题

目录 问题 解决步骤: 找到File->Project Structure... 设置SDK 设置SDKs 问题 刚刚在使用IDEA专业版创建好SpringBoot项目后,发现上方导航栏的运行按钮是灰色的,而且左侧导航栏的pom.xml的图标颜色也不是正常的,与此同时我…

Network - Telnet协议

Telnet 是一种网络协议,允许用户使用基于文本的界面通过网络与远程设备通信。它在早期的网络应用中被广泛用于远程管理和故障诊断,使用户能够连接到远程机器和服务,通常是通过 TCP/IP 网络。 Telnet is a network protocol that allows a use…

详细分析Spring Security OAuth2中的JwtAccessTokenConverter基本知识(附Demo)

目录 前言1. 基本知识2. Demo3. 实战 前言 java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新) 1. 基本知识 JwtAccessTokenConverter 是 Spring Security OAuth2 中的一…

如何创建免费版本的ABP分离模块?

由于ABP最近官方大改革,我们打开ABP.IO 官方会发现通过Cli创建模板的时候不能创建Trered类型的了 就是创建一个分层的解决方案,其中Web和Http API层在物理上是分开的。如果不勾选,则创建一个分层的解决方案,它不那么复杂&#xf…

Taipy:AI应用全栈开发神器

Taipy 是一个免费使用的 Python 库,任何具备基本 Python 技能的人都可以使用。它是数据科学家、机器学习工程师和 Python 程序员的得力工具。使用 Taipy,你可以轻松地将数据和机器学习模型转换为功能齐全的 Web 应用程序。在我们生活的瞬息万变的世界中&…

SpringBoot:让开发更加简单

文章目录 前言什么是 SpringBoot快速启动一个 SpringBoot 项目开发一个登录功能小结 前言 有一天,你脑海中闪现了一个想法:“学了 Java 好像还没怎么使用,今天要不用 Java 开发一个自己的网站?” 你想着不禁激动起来,…

棋牌灯控计时计费系统软件免费试用版怎么下载 佳易王计时收银管理系统操作教程

一、前言 【试用版软件下载,可以点击本文章最下方官网卡片】 棋牌灯控计时计费系统软件免费试用版怎么下载 佳易王计时收银管理系统操作教程 棋牌计时计费软件的应用也提升了顾客的服务体验,顾客可以清晰的看到自己的消费时间和费用。增加了消费的透明…

NASA:GES DISC 的 ATMOS L1 光谱和运行日志 V3 (ATMOSL1)大气痕量分子光谱(ATMOS)1 级产品

目录 简介 变量 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 ATMOS L1 Spectra and Runlogs V3 (ATMOSL1) at GES DISC 简介 这是第三版大气痕量分子光谱(ATMOS)1 级产品,包含 netCDF 格式的光谱和运行日志(即 &…

Codeforces Round 977

这场比赛是晚上vp的,太逆天了自己,给我自己都菜笑了,第二题当时差了一个那个循序渐进的点没想到,关键细节都想到了,当时以为是错的就没写,第二题没做出来确实好久没遇到过了,裂开 话不多说&…

WMCTF 2024 wp

WEB PasswdStealer 前言 本来题目叫PasswdStealer的:) 考点就是CVE-2024-21733在SpringBoot场景下的利用。 漏洞基本原理参考 https://mp.weixin.qq.com/s?__bizMzg2MDY2ODc5MA&mid2247484002&idx1&sn7936818b93f2d9a656d8ed48843272c0不再赘述。 Spri…

谷歌发布了日语版的 Gemma2 模型——gemma-2-2b-jpn-it

Gemma 是一系列同类最佳的开放式模型,其灵感和技术源自 Gemini 系列模型。 它们是具有开放权重的文本到文本、纯解码器大型语言模型。 Gemma 模型非常适合各种文本生成任务,包括问题解答、摘要和推理。 Gemma-2-JPN 是一个针对日语文本进行微调的 Gemma…

详细分析Spring Framework中 @ConditionalOnProperty的基本知识(附Demo)

目录 前言1. 基本知识2. Demo 前言 基本的Java知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新) 从实战中学习启发 1. 基本知识 Conditiona…

20分钟写一个链表

目录 前言1.带头结点的循环双链表1.1 链表的分类、线性表的对比1.2 双链表基本操作代码实现1.2.1 初始化1.2.2 销毁、打印链表 总结 前言 有一个学长在面试的时候被问到这样一个问题,“你可以用20分钟写一个链表吗?”学长第一反应是,至少要一…

BFS解决多源最短路问题_01矩阵_C++【含多源最短路问题介绍+dist数组介绍】

BFS解决多源最短路问题_01矩阵_C 0. 多源最短路问题介绍1. 题目解析算法分析2. 代码实现 0. 多源最短路问题介绍 如图,红色是出发点,蓝色是终点。以前我们做的题中,出发点只有一个,所谓多源的意思就是,出发点有多个&am…

KubeSphere中集成ApiSix

一、Apache APISIX 介绍 Apache APISIX 是一款开源的高性能、动态云原生网关,由深圳支流科技有限公司于 2019 年捐赠给 Apache 基金会,当前已经成为 Apache 基金会的顶级开源项目,也是 GitHub 上最活跃的网关项目。Apache APISIX 当前已经覆盖…

✨ComfyUI workflow加密工具节点ComfyUI_CryptoCat

✨背景 玩comfyui的朋友都了解,工作流workflow是一种很重要的资产,可以通过workflow把一系列的处理工作组织起来,提升工作效率,甚至分享生成的图片就可以还原整个的工作流,对于分享传播是个好事情,但是对于…

8位单片机与32位单片机

8位单片机与32位单片机 8位与32位指的是什么 单片机的8位或32位说的是什么呢?要搞懂这个问题,首先要搞明白8位或32位说的是单片机上的哪一个部件。 这是单片机的内部框图。单片机内部由这么多部件构成,并不单单是一个CPU,它内部…

微软推出针对个人的 “AI伴侣” Copilot 会根据用户的行为模式、习惯自动进化

微软推出了为每个人提供的“AI伴侣”Copilot,它不仅能够理解用户的需求,还能根据用户的日常习惯和偏好进行适应和进化。帮助处理各种任务和复杂的日常生活场景。 它能够根据用户的生活背景提供帮助和建议,保护用户的隐私和数据安全。Copilot…