(转)Linux TTY framework_软件架构

1. 前言

由“Linux TTY framework(1)_基本概念”的介绍可知,在Linux kernel中,TTY就是各类终端(Terminal)的简称。为了简化终端的使用,以及终端驱动程序的编写,Linux kernel抽象出了TTY framework:对上,向应用程序提供使用终端的统一接口;对下,提供编写终端驱动程序(如serial driver)的统一框架。

本文是Linux TTY framework分析的第二篇文章,将从整体架构的角度,介绍Linux TTY framework,以便分解出功能相对独立的子模块,以便后续的分析。

2. 软件架构

Linux kernel TTY framework位于“drivers/tty”目录中,其软件框架如下面图片1所示:

tty_arch

图片1 Linux TTY framework框架

和Linux其它的framework类似,TTY framework通过TTY core屏蔽TTY有关的技术细节,对上以字符设备的形式向应用程序提供统一接口,对下以TTY device/TTY driver的形式提供驱动程序的编写框架。具体请参考后续章节介绍。

2.1 TTY Core

TTY core是TTY framework的核心逻辑,功能包括:

1)以字符设备的形式,向用户空间提供访问TTY设备的接口,例如:

设备号(主, 次)        字符设备                                   备注
(5, 0)                     /dev/tty                                     控制终端(Controlling Terminal)
(5, 1)                     /dev/console                             控制台终端(Console Terminal)
(4, 0)                     /dev/vc/0 or /dev/tty0                  虚拟终端(Virtual Terminal)
(4, 1)                     /dev/vc/1 or /dev/tty1                  同上
…                         …                                             …
(x, x)                     /dev/ttyS0                                 串口终端(名称和设备号由驱动自行决定)
…                         …                                             …
(x, x)                     /dev/ttyUSB0                            USB转串口终端
…                         …                                             …

注1:控制终端、控制台终端、虚拟终端等概念,比较抽象,我会在后续的文章中详细介绍。

2)通过设备模型中的struct device结构抽象TTY设备,并通过struct tty_driver抽象该设备的驱动,并提供相应的register接口。TTY驱动程序的编写,简化为填充并注册相应的struct tty_driver结构。

注2:TTY framework弱化了TTY设备(图片1中使用虚线框标注)的概念,通常情况下,可以在注册TTY驱动的时候,自动分配并注册TTY设备。

3)使用struct tty_struct、struct tty_port等数据结构,从逻辑上抽象TTY设备及其“组件”,以实现硬件无关的逻辑。

4)抽象出名称为线路规程(Line Disciplines)的模块,在向TTY硬件发送数据之前,以及从TTY设备接收数据之后,进行相应的处理(如特殊字符的转换等)。

2.2 System Console Core

Linux kernel的system console主要有两个功能:

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

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

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

2.3 TTY Line Disciplines

线路规程(Line Disciplines)在TTY framework中是一个非常优雅的设计,我们可以把它看成设备驱动和应用接口之间的一个适配层。从字面意思理解,就是辅助TTY driver,将我们通过TTY设备键入的字符转换成一行一行的数据[3],当然,实际情况远比这复杂,例如在蜗窝x project所使用的kernel版本中,存在如下的Line Disciplines(以n_为前缀,我们后续的文章会更为详细的介绍):

pengo@DESKTOP-CH8SB7C:~/work/xprj/linux$ ls drivers/tty/n_*
drivers/tty/n_gsm.c   drivers/tty/n_r3964.c        drivers/tty/n_tracesink.c  drivers/tty/n_tty.c
drivers/tty/n_hdlc.c  drivers/tty/n_tracerouter.c  drivers/tty/n_tracesink.h

2.4 TTY Drivers以及System Console Drivers

最后,对内核以及驱动工程师来说,更关注的还是具体的TTY设备驱动。在kernel为我们搭建的如此beauty的框架下面,编写相应的driver就成为一件比较简单的事情了。当然的kernel中,主要的TTY driver有两类:

1)虚拟终端(Virtual Terminal,VT)驱动,位于drivers/tty/vt中,负责实现VT(后续文章会详细介绍)有关的功能。

2)串口终端驱动,也即我们所熟知的serial subsystem(话说终于到重点了,哈哈),位于drivers/tty/serial中。

3. 总结

本文对Linux TTY framework的软件框架作了一个简单的介绍,目的是从整体上了解Linux TTY有关的软件实现。基于本文的描述,后续计划从如下角度继续TTY framework的分析:

控制终端、控制台终端、虚拟终端等概念的理解及解释;

TTY core的分析;

System Console Core的分析;

Serial subsystem(串口子系统)的分析;

虚拟终端(VT)的分析;

常用线路规程(Line Disciplines)的介绍和分析;

等等。

4. 参考文档

[1] TTY驱动分析

[2] 控制终端(controlling terminal),https://linux.die.net/man/4/tty

[3] https://utcc.utoronto.ca/~cks/space/blog/unix/TTYLineDisciplineWhy

来源:网络


智能推荐

Linux tty登录提示Login incorrect的解决方法

Linux切换到tty登录时,明明输入了正确的用户名和密码,可仍然一直提示Login incorrect, 摸索了几次发现,这是由于我的密码中包含数字,而此时num lock数字键盘的锁定状态不正确引起的,只要重新按几下num lock小键盘锁定健,指示灯熄灭再重新亮起,屏幕显示 Hint: Num Lock on 后,再重新输入账号密码即可。    ...

TTY揭秘

前一阵子调试了一个串口驱动,原以为很简单,调式过程中还是遇到了很多问题。查阅了一些资料后发现Linux的串口设备,也就是tty子系统是一个很有历史,颇为复杂的一个子系统,值得好好研究一下。在网上找到了一篇关于tty的文章,感觉不错,决定翻译一下。水平有限,难免有误,希望大家指正。 原文地址:http://www.linusakesson.net/programming/tty/index.php ...

TTY设备

一、TTY设备 在*nix中,tty设备用来抽象串口类型的设备,它位于字符驱动之下,抽象了串口设备需要的特性、功能,抽象后的一个tty设备即可表示一个串行输入、输出接口(比如控制台口,串口、pty设备接口)。 TTY的实现由两部分组成: Tty core:它以统一一致的方式来处理流向某个tty设备的数据以及来自某个tty设备的数据,并向用户空间提供了统一一致的用户接口,向底层即真实的设备驱动提供了...

神秘TTY:The TTY demystified

目录 History The use cases Processes Jobs and sessions The following shell interactions... ...correspond to these processes... ...and these kernel structures. Signal madness SIGHUP SIGINT SIGQUIT SIGPIP...

Linux安装curl完整步骤

文章目录 1:安装步骤 1:安装步骤 下载curl安装包:wget http://curl.haxx.se/download/curl-7.38.0.tar.gz 解压:tar -xzvf curl-7.38.0.tar.gz 进入解压后的curl文件夹:cd curl-7.38.0 输入: ./configure --prefix=/usr/local/curl 输入:make &&am...

猜你喜欢

for章的家庭作业

1.说明在循环结构中的break语句和continue语句的区别。 答:continue语句 是跳过本次循环 break语句 是跳出整个循环 2.使用for循环结构实现:从键盘上接收从周一至周五每天的学习时间(以小时为单位),并且计算每天平均学习时间。 答: 3.鸡兔同笼是我国古代著名的趣题之一,大约在1500年前,《孙子算经》中记载了这样一道题目:今有鸡兔同笼,上有三十五头,下有九十四足,问鸡兔...

阿里云服务器或聚石塔的容器无法访问外网问题

1,阿里云无法访问外网解决方案:    不具备公网能力,给服务器配置公网ip或者eip即可(弹性公网ip)。   2,聚石塔的容器内访问不了外网的解决方案:    1,给聚石塔使用的服务器配置公网ip或者eip(弹性公网ip)。    2,重新新建集群并勾上SNAT(这个集群的网络,是必须要有SNAT的,不然容器出不了公网)。...

国产数据库达梦的表空间管理

1、创建表空间 SQL: CREATE TABLESPACE TBS5 DATAFILE 'D:\dmdbms\data\DAMENG\TBS5.DBF' SIZE 50; 2、创建表空间,表空间可自动扩展,每次扩展1M,表空间最大空间为100M SQL:CREATE TABLESPACE TBS6 DATAFILE 'D:\dmdbms\data\DAMENG\TBS6.DBF' SIZE 50...

RabbitMQ详解(三):存储机制、流控

六、RabbitMQ高阶 1、存储机制 不管是持久化的消息还是非持久化的消息都可以被写入到磁盘。持久化的消息在到达队列时就被写入磁盘,并且如果可以,持久化的消息也会在内存中保存一份备份,这样可以提高一定的性能,当内存吃紧的时候会从内存中清除。非持久化的消息一般只保存在内存中,在内存吃紧的时候会被换入到磁盘中,以节省内存空间。这两种类型的落盘处理都在RabbitMQ的持久层中完成 持久层是一个逻辑上...

matlab数量统计和功率统计及集成app展示(回调函数实现、多种函数调用)

matlab数量统计和功率统计及集成app展示(回调函数实现) 整个过程很杂很长,这里仅展示一下效果吧,如果有需要帮助可以联系我qq420360612。 首先是一个简单的用到所开发的模块的电路: 则app可以统计出该电路仿真文件中应用的不同种类电路数量,生成多种统计文档。 还可以得到较详细的功率分析信息: 以及预定好的故障排查。...

问答精选

Is it possible to schedule cron job when changes are detected

I'm setting up my first cron-job and I know I can have it run at specific times every day for example. However, I would really like to only run the command if it detects a change or new file added to ...

Google Play Store Subscriptions History

I'am using subscriptions in my application and it is working perfectly during testing. However, I didn't find a way to get user subscription history for all transactions. Example: -User subscribed to ...

Using External DLLs in a Portable Class Library

I am coding up a Portable Class Library (PCL) that is setup for .NET 4.5, Windows RT and Windows Phone 8. I want to find the min value in a Dictionary. Searching the web says that MoreLinq is the fast...

undefined method `each' for nil:NilClass for order method

I get this error when I try to run my code. From what I've researched my problem is either in my controller or my view This is my controller This is my view I'm running Rails 5.1.3 Ruby 2.4.1 Undefine...

Why cannot I use value in constant as custom type definition?

This is not compilable This is compilable The first problem you have is that the type of the properties are actually all string not string literal types like you might expect. To fix this we can eithe...

相关问题

相关文章

热门文章

推荐文章

相关标签

推荐问答