忍不住再次说一下unix的流机制。周末在家调试linux的终端驱动,发现linux并没有按照unix流机制的建议来实现tty驱动,虽然我对windows内核理解不如对linux深刻,可是还是略知一二,windows的分层驱动模型倒是和unix流机制甚是相似,如出一辙。windows借鉴了unix的很多思想,或者说英雄所见略同,而linux却是典型的实用主义者,根本不管什么架构。
linux的tty驱动基本分为三层,一层在虚拟文件系统vfs,另一层是线路规程(或者称行规程),最下面一层是设备驱动,了解了大体架构之后再看linux的具体实现,vfs层的基本就是一个file_operations,而线路规程则是一个tty_ldisc,而驱动则没有统一的表示了,驱动层和线路规程有一个接口,那就是线路规程的receive_buf函数,或者在硬件中断中,或者在软中断中,或者在工作队列中等,驱动程序调用receive_buf函数将字符放入一个队列,然后唤醒等待的睡眠进程,在receive_buf执行线路规程规定的键码的解释,最终睡眠在tty的vfs层read方法中继而睡眠在线路规程的read中的进程被唤醒,取出字符;写终端的过程也是这样,vfs的write直接调用线路规程的write,然后数据就到了驱动,每个tty都直接绑定一个tty_driver,后者有一个tty_operations,线路规程的write就是调用了该tty_driver的write...这个过程不就是最原始的unix对tty的处理机制吗?和流机制相去甚远,在流机制中,vfs层往下调用,应该对下层是什么一无所知,是线路规程还是一般的驱动程序,还是一系列的规程等等,这些都应该对vfs层完全透明,可是linux的tty驱动实现中,一切都好似硬编码的,虽然一个线路规程可以透明地堆叠在另一个线路规程上,但是vfs层下却只能是一个线路规程,和最原始的unix实现一样,unix的队列是用clist(别指望在网上得到大量信息,如果你搜索clist,结果十有八九是mfc的)实现的,该clist机制是基于单独字符的缓冲,因此取字符或者放字符只能一个一个进行,linux的队列也是这样,只是不用clist这个结构体了,unix操作clist开销要比linux的更大一些,因为操作clist结构体要比linux如今使用的单一队列更复杂。
看看unix后来的实现,特别是bsd的实现,流机制引导下的分层模型大行其道,具体参见我前面的文章《从文件系统看系统架构》。unix原始的clist实现的tty驱动和linux的一些tty设备驱动一样,都是对输入和输出的不对称处理,输入可以直接输出到驱动,而输入却涉及到了设备的中断,所以为了不使中断更延迟,原始unix和linux的某些设备驱动实现都安排了两个输入队列,中断程序首先将数据放入第一个队列,然后中断返回,而后的进程上下文或者软中断中在将这些裸数据经过线路规程后加入第二个输入队列(linux的receive_buf)。
分享到:
相关推荐
TTY驱动实例详细说明,linux 系统下的代码
对linux tty驱动源码进行简要分析,明确tty工作流程,及tty线路规程作用。
TTY线路规程的作用就是对准备发送的数据进行一些处理,...在TTY驱动程序之上就是线路规程了,他负责把从tty核心层或者tty驱动层接收的数据进行特殊的按着某个协议的格式化,就像是ppp或者蓝牙协议,然后在分发出去的。
linux虚拟tty驱动(kernel4.9版本以上),可产生多个tty串口设备于/dev/下,本人在Hi3516上交叉编译并应用,实现多个虚拟串口同时控制一个实际串口的操作
第 18 章 tty驱动程序.txt 第 18 章 tty驱动程序.txt
Tiny TTY driver驱动源码,这是ldd3描述tty驱动时候用到的示例驱动,很有参考价值。
linux 串口 tty 流程 流程图 详细的而形象描述了linux tty 驱动的执行过程
Linux内核TTY驱动架构[归类].pdf
这就是我们今天要讨论的问题Tty架构如下所示:如上图所示,用户空间主要是通过设备文件同tty_core交互.tty_core根据用空间操作的类型再选择跟line discipline和tty_driver交互.例如设置硬件的ioctl指令就
ty_driver 结构用来注册一个 tty 驱动到 tty 核心. 这是结构中所有不同的成员的列表和如何被 tty 核心使用: struct module *owner;...驱动的名子, 用在 /proc/tty 和 sysfs. const char *name; 驱动的节点名.
tty工作台驱动,适合工作台驱动的所有底层工作。有借鉴价值!
在Linux 系统中,终端设备非常重要,没有终端设备,系统将无法向用户反馈信息,Linux中包含控制台、串口和伪终端3 类终端设备
前面有一个资源是讲述终端设备基本概念的。 这个是终端设备tty的深入版本。从终端设备的架构出发,深入讲解终端设备。 相信这对需要了解终端设备tty的人员会有相当大的帮助。
Linux平台的设备驱动程序开发的参考例子,tty模块源码
Linux串口 驱动 源码 tty
计算机控制工程,TTY接受程序计算机控制工程,TTY接受程序计算机控制工程,TTY接受程序
讲述了linux下驱动基础知识: 1. 终端设备tty 2. 虚拟终端pty 3. 其他终端 对理解linux下的设备知识有很大的帮助
在 Linux 系统中,终端是一种字符型设备,它有多种类型,通常使用 tty 来简称各种类型的 终端设备。tty 是 Teletype 的缩写,Teletype 是最早出现的一种终端设备,很像电传打字 机,是由 Teletype 公司生产的。Linux...
linux tty device driver