注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Tsecer的回音岛

Tsecer的博客

 
 
 

日志

 
 

Linux中的终端及伪终端  

2011-06-25 23:57:41|  分类: Linux内核 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一、终端的概念

早期的终端是真正的一个终端,也即是一个电传打字机tyletype设备。当我们通过唯一的一个串口线链接到一个主机上之后,终端和串口之间就可以进行通讯。这个终端的功能比较简单,识别的内容也不复杂。

终端包含了两个部分,一个是输入部分,一个是显示部分,但是这两个部分都是通过一个串口线和主机通讯的。也就是主机通过tty的read可以读到终端的输入,也就是远程终端操作者输入的字符;然后主机可以通过tty的write向串口发送字符,这个字符就由终端负责显示到自己的屏幕上。一把来说,这个终端并不是像我们PC那样直接写入约定的内容就可以了,这里的终端明显没有这种处理能力,也不需要有这种处理能力,它只需要简单的把从串口上接受的内容显示到自己的显示屏上就可以了。至于这个显示过程如何完成、如何翻屏等实现,主机并不需要也没有办法知道。

但是虽然这个终端是如此的呆傻,但是它同样具备了一些让我们惊喜的性能。例如,我们通常在简单的字符界面上希望显示一个输入定位符(光标)、希望对某些字体进行特殊颜色显示。但是终端和主机之间的通讯又是如此的简单,它只能从串口上接收一些非常简单的字符,这样这些控制字符就需要另外想办法了。

二、控制的设置

这一点和我们PC上的显示器中的显示是不同的,因为对于显示器,如果我们希望一个字符显示为特殊颜色,或者移动光标,都是通过dos的命令来进行的。例如,我们希望一个字符显示为一个特殊的颜色,我们是通过一个特定位置的属性字符来设置这个字符显示的颜色。例如,我们希望将一个屏幕向上翻一行,或者其他操作,那么我们归根到底依然是内存位置的操作。

对于串口,它没有这么多的控制端口可以进行操作,也没有这么多的内存进行操作,它只会简单的接受一个单薄的串口线上发送的字符。所以,终端设备就有义务从这个串口线上接受的字符中识别出哪些是控制字符,哪些是显示字符。内核中发出的控制序列需要由终端来自行识别、解析和处理。内核只是当做简单、常规字符发送

对于7bits的ASCII码,刚好前32个字符是不可显示的。所以中断就利用了这些字符表中的控制字符来做一些文章。特别的,串口显示使用的是ESC作为控制字符的特殊标志,该值的ASCII码为27==0x33。也就是说,当终端接收到这样个字符的时候,它就会对之后的内容进行特殊的处理,从而作为一个控制字或者控制指令序列。特别地,当使用ESC + [ 可以模拟出8bitsASCII码中的CSI Control Sequence Indicator,从而引入一个控制序列,这样可以实现更多更复杂的显示控制。

三、虚拟终端

这里所谓的虚拟中断就是这个终端并没有对应一个teletype设备,而是在PC上通过软件(内存+显示器)来模拟一个终端上的显示。对于新的版本的内核,这个模拟的伪终端的代码位于linux-2.6.37.1\drivers\tty\vt\vt.c中,其中模拟了一个终端对于控制字符的处理方法。也就是通过软件来解析指令序列,从而使这个窗口看起来像一个真正的终端一样工作。我们可以看到,其中大量的csi_XXX函数即是对终端控制字符处理的模拟。

四、应用

在嵌入式系统中,我们有时候可能需要通过一些特殊的颜色来告诉用户,系统刚刚发生了一个比较严重的、值得关注的事情。或者我们常见的在bash的输出中,不同类型的文件在bash中显示为不同的颜色,这些都需要使用终端的颜色显示功能,至于这些颜色是如何定义的以及如何实现的,我想我们可以参考内核中这个文件找到答案。

其巧妙之处就在于我们可以不添加任何系统调用(只是用printf)而直接修改终端中字符的显示颜色

  评论这张
 
阅读(1131)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017