个人网站 flash,北京工商注册app下载,wordpress 首页404,软件工程的就业前景和就业方向往期内容 本专栏往期内容#xff1a;Uart子系统 UART串口硬件介绍 interrupt子系统专栏#xff1a; 专栏地址#xff1a;interrupt子系统Linux 链式与层级中断控制器讲解#xff1a;原理与驱动开发 – 末片#xff0c;有专栏内容观看顺序 pinctrl和gpio子系统专栏#xf…往期内容 本专栏往期内容Uart子系统 UART串口硬件介绍 interrupt子系统专栏 专栏地址interrupt子系统Linux 链式与层级中断控制器讲解原理与驱动开发 – 末片有专栏内容观看顺序 pinctrl和gpio子系统专栏 专栏地址pinctrl和gpio子系统 编写虚拟的GPIO控制器的驱动程序和pinctrl的交互使用 – 末片有专栏内容观看顺序 input子系统专栏 专栏地址input子系统input角度I2C触摸屏驱动分析和编写一个简单的I2C驱动程序 – 末片有专栏内容观看顺序 I2C子系统专栏 专栏地址IIC子系统具体芯片的IIC控制器驱动程序分析i2c-imx.c-CSDN博客 – 末篇有专栏内容观看顺序 总线和设备树专栏 专栏地址总线和设备树设备树与 Linux 内核设备驱动模型的整合-CSDN博客 – 末篇有专栏内容观看顺序 目录 往期内容1.TTY体系中设备节点的差别1.1 节点和术语1.2 演变1.2.1 电传机teletype1.2.2 计算机与ttyA.使用teletypeB.替换电传机C.个人电脑和虚拟终端 1.3 在ubuntu上实验1.3.1 各类设备节点的差别1.3.2 /dev/ttyN(N1,2,3,...)1.3.3 /dev/tty01.3.4 /dev/tty1.3.5 Terminal和Console的差别1.3.6 /dev/console 2.TTY驱动程序框架2.1 行程规的引入2.2 TTY驱动程序框架 1.TTY体系中设备节点的差别
1.1 节点和术语
/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程序自己的终端可能是串口、也可能是虚拟终端不知道当前所处的中断说tty几可以直接使用/dev/tty来指代自己/dev/console控制台由内核的cmdline参数确定默认的情况下当前是处于哪个ttyx其就是console当然也可以通过设置cmdline来指定
TTY/Terminal/Console/UART
它们有什么差别
术语含义TTY来自teletype最古老的输入输出设备现在用来表示内核的一套驱动系统Terminal终端暗含远端之意也是一个输入输出设备可能是真实设备也可能是虚拟设备Console控制台含控制之意也是一种Terminal权限更大可以查看内核打印信息UART串口它的驱动程序包含在TTY驱动体系之内
控制台终端console 这类终端的输入设备通常是键盘输出设备通常是显示器 输入、输出设备通过各类总线直接和计算机相连 “终端”其实是这些设备的一个逻辑抽象。 虚拟终端VT 控制台终端的输出设备显示器一般只有一个同一时刻由一个应用程序独占 但在多任务的操作环境中有时需要在将终端切换给另一个应用程序之前保留当前应用在终端上的输出以方便后面查看 因此Unix/Linux系统在控制台终端的基础上又虚拟出来6个终端----称作虚拟终端不同的应用程序可以在这些虚拟终端上独立的输出在需要的时候可以通过键盘的组合键CTRLALT F1~F6将某一个虚拟终端调出来在屏幕上显示。 串口终端TTY 这是正牌的TTY设备 输入设备和输出设备集成在一个独立的硬件上称作TTY设备这个硬件和计算机通过串口连接 输入设备键盘的输入动作将会转换为串口上的RX数据包以计算机为视角发送给计算机 计算机的输出会以TX数据包的形式发送给TTY设备TTY设备转换后在输出设备屏幕上显示。 软件终端 这是我们现在最常用的终端 既然人机交互的数据流可以封装后经过串口传输那么终端设备的形式就不再受限了只要可以接收用户的输入并打包通过串口发送给计算机以及接收计算机从串口发来的输出并显示出来任何设备都可以变成终端设备例如另一台计算机 当另一台计算机被当作终端设备时通常不会把它的所有资源都用来和对端进行人机交互常用的方法是在这个计算机上利用软件模拟出来一个“终端设备”。该软件就像一个中间商从键盘接收用户输入然后控制串口发送给对端从串口接收对端的输出然后在软件界面上显示出来 平时大家经常使用的PuTTY、SecureCRT、Windows超级终端、等等都是“软件终端”。 USB、网络等终端 既然串口可以作为人机交互数据的传说媒介其它通信接口一样可以例如USB、Ethernet、等等其原理和串口终端完全一样这里不再过多说明。 图形终端 前面所介绍的那些终端人机交互的输出界面都是字符界面随着计算机技术的发展GUI界面慢慢出现并成为主流这些通过GUI交互的形式也可以称作图形终端。不过这已经超出了TTY framework系列文章的讨论范围了因为TTY的势力范围只涵盖字符界面。 1.2 演变
1.2.1 电传机teletype
teletype更准确地说是teleprinter是一种通信设备可以用来发送、接收文本信息。
teletype是一家公司的名字它生产的teleprinter实在太有名结果公司名变成了这类产品的名字teleprinter都被称为teletype了。
teletype被用来传输商业电报想像一下
把两台teletype的线缆接在一起或者使用无线技术连接两台teletype这边打字另一边就可以接收到信息并通过纸张打印出来注意这两台teletype可以离得很远
1.2.2 计算机与tty
A.使用teletype
teletype的简称就是TTY。
最古老的计算机支持的是批处理模型
怎么编程卡片打孔然后喂给计算机。怎么得到输出信息计算机根据结果在卡片上打孔需要专人翻译这些卡片。
通过使用teletype电传机与计算机相连接可以即时输入指令、即时看到结果。于是teletype变成了计算机的终端、Terminal远端之意。teletype和计算机可以放在一个房间里也可以放在很远很远的地方。 B.替换电传机
1960年代CRT显示器键盘替代了teletype
显示器替代了纸张速度更快成本更低它仍然只是一个终端(terminal)通过线缆连接到计算机虽然不再是teletype但是它的驱动程序仍然叫做TTY
它仍然是和计算机相连其实就是现在台式机使用时配备的键盘以及显示器。
C.个人电脑和虚拟终端 像现在的电脑虽然只有一个显示器和键盘也就是一个物理终端但是其打开多个命令行程序terminal、shell可以显示多个终端虚拟终端并不需要说多少个终端就需要多少个显示器。
1.3 在ubuntu上实验
1.3.1 各类设备节点的差别 1.3.2 /dev/ttyN(N1,2,3,…)
/dev/tty3、/dev/tty4表示某个程序使用的虚拟终端
// 在tty3、tty4终端来回切换执行命令echo hello /dev/tty3
echo hi /dev/tty4虚拟终端是虚拟出来的一个终端不对应具体的设备屏幕和键盘。应用程序可以打开某一个虚拟终端以便和人进行交互。
对应用程序而言这个终端和具体的物理终端没有任何区别应用程序也无法区分。而对整个系统来说由于物理资源键盘和屏幕只有一套因此同一时刻只能和某一个虚拟终端对接。从另一个角度看各个虚拟终端轮流使用物理资源和人进行交互如下所示 1.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; done1.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; done1通常情况下Linux启动后终端以后都用TTY指代的控制权会交给shell一种应用程序。所谓的控制权就是指shell程序可以通过TTY读取终端的输入以及通过TTY向终端输出。
2通过shell可以启动其它的应用程序相应地应用程序在需要的时候也会获得TTY的控制权。
3同一时刻只能有一个应用可以占有TTY即只有一个应用可以通过TTY输入、输出。
4那个占有TTY、可以进行输入输出的应用称作前台应用。相应的不能进行输入输出的应用称作后台应用。因此shell中只有一个前台应用可以有多个后台应用。
5然后问题就来了如果某个后台应用就是想输入输出怎么办有一个办法就是通过控制终端control terminal。
6控制终端在Linux中的名称固定为/dev/tty, 设备号为(5, 0)作用和/dev/console类似进程可以通过TTY core提供的ioctl选择控制终端所对应的实际的终端设备。
7暂且抛开前台应用不谈因为人家有TTY设备对于那些后台应用如果想输入输出可以读取或者写入控制终端。此时一般情况下TTY core会向后台应用发送SIGTTIN(读取控制终端时) 或者 SIGTTOU写入控制终端时信号这会终止该后台应用。
8不过shell会重设收到 SIGTTOU信号时的行为于是后台应用写入的内容可以通过控制终端显示出来。
不一定准确只帮助理解
1.3.5 Terminal和Console的差别
Terminal含有远端的意思中文为终端。Console翻译为控制台可以理解为权限更大、能查看更多信息。
比如我们可以在Console上看到内核的打印信息从这个角度上看
Console是某一个TerminalTerminal并不都是Console。可以从多个Terminal中选择某一个作为Console很多时候两个概念混用并无明确的、官方的定义
1.3.6 /dev/console
选哪个内核的打印信息从哪个设备上显示出来 可以通过内核的cmdline来指定 比如: consolettyS0 consoletty 我不想去分辨这个设备是串口还是虚拟终端 有没有办法得到这个设备 有通过/dev/console consolettyS0时/dev/console就是ttyS0 consoletty时/dev/console就是前台程序的虚拟终端 consoletty0时/dev/console就是前台程序的虚拟终端 consolettyN时/dev/console就是/dev/ttyN console有多个取值时使用最后一个取值来判断 kernel启动的后期会在kernel_init线程最后会退化为init进程中打开控制台终端。但是由上面3.1小节的介绍可知控制台终端的类型、名称是五花八门的怎么让kernel的核心代码无视这些差异呢这就是“/dev/console”的存在意义
在linux knerl 3.XX中/dev/console的设备号固定为(5, 1) 当init线程打开该设备的时候TTY core会问system console core喂哪一个终端适合做控制台终端啊
因此最终打开的是那个具体的、可以当作控制台终端的设备而“/dev/console”仅仅是一个占位坑如下图所示 回到Unix系统支持多用户的时代此时的PC有一个自带的、昂贵的终端自身的键盘、显示器等另外为了支持多用户可以通过串口线连接多个TTY终端Teletype。为了彰显自带终端崇高的江湖地位人们称它为console。
当然“江湖地位”之说纯属玩笑不过从console的中文翻译-----控制台可以看出自带终端console有别于TTY终端的地方如下 1控制台console是昂贵的。 2控制台console比TTY终端拥有更多的权限例如用户建立、密码更改、权限分配等等这也是“控制”的意义所在。 3系统的运行日志、出错信息等内容通常只会输出到控制台console终端中以方便管理员进行“控制”和“管理”。 不过随着计算机技术的发展、操作系统的改进控制台console终端和普通TTY终端的界限越来越模糊console能做的事情普通终端也都能做了。因此console逐渐退化以至于在当前的Linux系统中它仅仅保留了第三点“日志输出”的功能这就是Linux TTY framework中console的概念
2.TTY驱动程序框架
2.1 行程规的引入 下文来自解密TTY
大多数用户都会在输入时犯错所以退格键会很有用。这当然可以由应用程序本身来实现但是根据UNIX设计“哲学”应用程序应尽可能保持简单。为了方便起见操作系统提供了一个编辑缓冲区和一些基本的编辑命令退格清除单个单词清除行重新打印这些命令在行规范line discipline内默认启用。高级应用程序可以通过将行规范设置为原始模式raw mode而不是默认的成熟或准则模式cooked and canonical来禁用这些功能。大多数交互程序编辑器邮件客户端shell及所有依赖curses或readline的程序均以原始模式运行并自行处理所有的行编辑命令。行规范还包含字符回显和回车换行译者注\r\n 和 \n间自动转换的选项。如果你喜欢可以把它看作是一个原始的内核级sed(1)。
另外内核提供了几种不同的行规范。一次只能将其中一个连接到给定的串行设备。行规范的默认规则称为N_TTYdrivers/char/n_tty.c如果你想继续探索的话。其他的规则被用于其他目的例如管理数据包交换pppIrDA串行鼠标但这不在本文的讨论范围之内。
2.2 TTY驱动程序框架 键盘输入信息后通过键盘驱动程序保留在某个buff当中vitual console/terminal
假设想在终端上输入ls结果输成了la - del - l - s - ls PC的UART收到返回 l 后会将其通过别的串口给显示到屏幕终端上
删除a输入s后确认为lsPC终端上再点击回车确认发送enter给开发板后ls就会上报给开发板内的相关程序显示出结果再重新通过开发板的串口返回给PC的UART
删除等操作其实都是行规程line discipline 来实现的行规程可以根据实际想要使用的情况进行修改的比如如果需要接入GPS模块那么开发板的行规程就需要设置为原始的模式(RAM模式)