网控科技网

设备与设备文件(device):与系统外设及存储等相关的一些文件,

简介: 5、设备与设备文件(device):与系统外设及存储等相关的一些文件,通常都集中在 /dev目录。

本文通过对Linux下串口驱动的分析。

到操作系统系统调用层的封装。

再到tty子系统的核心。

再到最底层的硬件操作。

对Linux中的tty子系统进行简要的说明。

和Linux操作系统有一定的了解。

不过遗憾的是对一些概念有着不可避免的向前引用。

可以直接阅读后面的代码分析:1、什么是Linux操作系统 ?

Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。

它能运行主要的UNIX工具软件、应用程序和网络协议。

Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

Linux存在着许多不同的Linux版本,但它们都使用了Linux内核。

Linux具备惊人的可移植性。

严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。

在这几个简要的段落中。

A、关于类UNIX系统类Unix系统(英文:Unix-like)指各种传统的Unix系统(比如FreeBSD、OpenBSD、SUN公司的Solaris)以及各种与传统Unix类似的系统(例如Minix、Linux、QNX等)。

它们虽然有的是自由软件,有的是商业软件,但都相当程度地继承了原始UNIX的特性,有许多相似处,并且都在一定程度上遵守POSIX规范。

这个在一些经典的操作系统教科书中已经作了说明。

它和我们熟知的Windows系列操作系统一样。

为获得较高的可移植性,在设计过程中常采用通用的程序设计语言和运行支撑环境。

可移植性是软件质量之一,良好的可移植性可以提高软件的生命周期。

代码的可移植性主题是软件;可移植性是软件产品的一种能力属性,其行为表现为一种程度,而表现出来的程度与环境密切相关。

一个操作系统的可移植性往往表现在它能在运行在不同的结构上。

感性的理解就是可以支持的设备有很多。

比如前文所说的,Linux可以运行在大型服务器上。

前段时间有成功的把Linux移植到一个佳能照相机上。

并且在这个照相机上运行了一些主流的软件。

只要有足够可以利用的硬件资源。

这可以与对硬件资源要求很高的Windows有一个鲜明的对比。

我想大多数人对这个问题的是否定的。

而如果你选择的是Linux。

你几乎可以任意的在计算机上安装软件。

运行程序(如果你的内存不是太小。

Linux核心已经将有限的硬件资源发挥到了极致。

开源软件良好的模块化设计在各个层次上充分利用了程序的局部性原理。

(当然这是在损失了一定易用性的前提下的。

它的CPU是三星公司生产的S3C2440。

C、关于Linux的基本思想Linux的基本思想有两点:第一. 一切都是文件。

系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件。

至于说Linux是基于Unix的,很大程度上也是因为这两者的基本思想十分相近第二. 每个软件都有确定的用途。

D、关于Linux的特点完全免费Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。

正是由于这一点,来自全世界的无数程序员参与了Linux的修改、编写工作,程序员可以根据自己的兴趣和灵感对其进行改变,这让Linux吸收了无数程序员的精华,不断壮大。

完全兼容POSIX1.0标准这使得可以在Linux下通过相应的模拟器运行常见的DOS、Windows的程序。

许多用户在考虑使用Linux时,就想到以前在Windows下常见的程序是否能正常运行,这一点就消除了他们的疑虑。

多用户、多任务Linux支持多用户,各个用户对于自己的文件设备有自己特殊的权利,保证了各用户之间互不影响。

多任务则是现在电脑最主要的一个特点,Linux可以使多个程序同时并独立地运行。

在字符界面用户可以通过键盘输入相应的指令来进行操作。

它同时也了类似Windows图形界面的X-Window系统,用户可以使用鼠标对其进行操作。

在X-Window环境中就和在Windows中相似,可以说是一个Linux版的Windows。

支持多种平台Linux可以运行在多种硬件平台上,如具有x86、680x0、SPARC、Alpha等处理器的平台。

文件类型普通文件(regular file):就是一般存取的文件,由ls-al显示出来的属性中,第一个属性为 [-],例如 [-rwxrwxrwx]。

另外,依照文件的内容,又大致可以分为:1、纯文本文件(ASCII):这是Unix系统中最多的一种文件类型,之所以称为纯文本文件,是因为内容可以直接读到的数据,例如数字、字母等等。

举例来说,使用命令“cat ~/.bashrc”就可以看到该文件的内容(cat是将文件内容读出来)。

Linux中的可执行文件(脚本,文本方式的批处理文件不算)就是这种格式的。

3、数据格式的文件(data):有些程序在运行过程中,会读取某些特定格式的文件,那些特定格式的文件可以称为数据文件(data file)。

举例来说,Linux在用户登入时,都会将登录数据记录在 /var/log/wtmp文件内,该文件是一个数据文件,它能通过last命令读出来。

因为它是属于一种特殊格式的文件。

4、目录文件(directory):就是目录,第一个属性为[d],例如 [drwxrwxrwx]。

连接文件(link):类似Windows下面的快捷方式。

5、设备与设备文件(device):与系统外设及存储等相关的一些文件,通常都集中在 /dev目录。

通常又分为两种:块设备文件:就是存储数据以供系统存取的接口设备,简单而言就是硬盘。

例如一号硬盘的代码是 /dev/hda1等文件。

字符设备文件:即串行端口的接口设备,例如键盘、鼠标等等。

可以启动一个程序来客户端的要求,客户端就可以通过套接字来进行数据通信。

第一个属性为 [s],最常在 /var/run目录中看到这种文件类型。

7、管道(FIFO,pipe):FIFO也是一种特殊的文件类型,它主要的目的是,解决多个程序同时存取一个文件所造成的错误。

FIFO是first-in-first-out(先进先出)的缩写。

第一个属性为 [p]文件结构/:根目录,所有的目录、文件、设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者。

在一般的系统当中,都可以在这个目录下找到linux常用的命令。

/boot:Linux的内核及引导系统程序所需要的文件目录,比如 vmlinuz initrd.img 文件都位于这个目录中。

/cdrom:这个目录在刚刚安装系统的时候是空的。

例如:mount /dev/cdrom /cdrom/dev:dev 是设备(device)的英文缩写。

这个目录对所有的用户都十分重要。

因为在这个目录中包含了所有linux系统中使用的外部设备。

它实际上是一个访问这些外部设备的端口。

/etc:etc这个目录是linux系统中最重要的目录之一。

在这个目录下存放了系统管理时要用到的各种配置文件和子目录。

要用到的网络配置文件,文件系统,x系统配置文件,设备配置信息,设置用户信息等都在这个目录下。

/home:如果建立一个用户,用户名是"xx",那么在/home目录下就有一个对应的/home/xx路径,用来存放用户的主目录。

这个目录是用来存放系统动态连接共享库的。

几乎所有的应用程序都会用到这个目录下的共享库。

当系统启动的过程中fsck工具会检查这里,并修复已经损坏的文件系统。

有时系统发生问题,有很多的文件被移到这个目录中,可能会用手工的方式来修复,或移到文件到原来的位置上。

/mnt:这个目录一般是用于存放挂载储存设备的挂载目录的,比如有cdrom等目录。

可以参看/etc/fstab的定义。

/media:有些linux的发行版使用这个目录来挂载那些usb接口的移动硬盘(包括U盘)、CD/DVD驱动器等等。

/opt:这里主要存放那些可选的程序。

这些信息是在内存中,由系统自己产生的。

/root:Linux超级权限用户root的家目录。

/sbin:这个目录是用来存放系统管理员的系统管理程序。

大多是涉及系统管理的命令的存放,是超级权限用户root的可执行命令存放地,普通用户无权限执行这个目录下的命令,这个目录和/usr/sbin; /usr/X11R6/sbin或/usr/local/sbin目录是相似的,凡是目录sbin中包含的都是root权限才能执行的。

/selinux :对SElinux的一些配置文件目录,SElinux可以让linux更加安全。

/srv 服务启动后,所需访问的数据目录,举个例子来说,www服务启动读取的网页数据就可以放在/srv/www中/tmp:临时文件目录,用来存放不同程序执行时产生的临时文件。

有时用户运行程序的时候,会产生临时文件。

/tmp就用来存放临时文件的。

/usr:这是linux系统中占用硬盘空间最大的目录。

用户的很多应用程序和文件都存放在这个目录下。

在这个目录下,可以找到那些不适合放在/bin或/etc目录下的额外的工具/usr/local:这里主要存放那些手动安装的软件,即不是通过“新立得”或apt-get安装的软件。

它和/usr目录具有相类似的目录结构。

让软件包管理器来管理/usr目录,而把自定义的脚本(scripts)放到/usr/local目录下面、。

/usr/share :系统共用的东西存放地,比如/usr/share/fonts 是字体目录,/usr/share/doc和/usr/share/man帮助文件。

/var:这个目录的内容是经常变动的,看名字就知道,可以理解为vary的缩写,/var下有/var/log 这是用来存放系统日志的目录。

/var/ www目录是定义Apache服务器站点存放目录;/var/lib 用来存放一些库文件,比如MySQL的,以及MySQL数据库的的存放地。

现在我们来看看第二个概念:2、什么是Linux设备驱动设备驱动最通俗的解释就是驱使硬件设备行动。

驱动与底层硬件直接打交道,按照硬件设备的具体工作方式,读写设备的寄存器,完成设备的轮询、中断处理、DMA通信,进行物理内存向虚拟内存的映射等,最终让通信设备能收发数据,让显示设备能显示文字和画面,让存储设备能记录文件和数据。

Linux设备驱动是对底层硬件资源的抽象。

对上层的操作系统其他服务一个良好的接口。

让其他服务可以把一个特定的硬件。

使用通用的系统调用进行调用。

3、关于串口的种种众所周知。

我们现在的计算机上面有很多接口。

串口总线是其中的一个。

串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。

串行通讯的特点是:数据位的传送,按位顺序进行,最少只需一根传输线即可完成;成本低但传送速度慢。

串行通讯的距离可以从几米到几千米;根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。

同步串行是指SPI(SerialPeripheral interface)的缩写,顾名思义就是串行外围设备接口。

异步串行是指UART(UniversalAsynchronous Receiver/Transmitter),通用异步接收/发送。

UART是一个并行输入成为串行输出的芯片,通常集成在主板上。

TTL电平是3.3V的,而RS232是负逻辑电平,它定义+5~+12V为低电平,而-12~-5V为高电平,MDS2710、MDS SD4、EL805等是RS232接口,EL806有TTL接口。

RS-232也称标准串口,最常用的一种串行通讯接口。

它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。

它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”。

传统的RS-232-C接口标准有22根线,采用标准25芯D型插头座(DB25),后来使用简化为9芯D型插座(DB9),现在应用中25芯插头座已很少采用。

由于其发送电平与接收电平的差仅为2V至3V左右,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最大为约15米,最高速率为20kb/s。

RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3~7kΩ。

所以RS-232适合本地设备之间的通信。

RS-422标准全称是“平衡电压数字接口电路的电气特性”,它定义了接口电路的特性。

典型的RS-422是四线接口。

由于接收器采用高输入阻抗和发送驱动器比RS232更强的驱动能力,故允许在相同传输线上连接多个接收节点,最多可接10个节点。

即一个主设备(Master),其余为从设备(Sle),从设备之间不能通信,所以RS-422支持点对多的双向通信。

RS-422四线接口由于采用单独的发送和接收通道,因此不必控制数据方向,各装置之间任何必须的信号交换均可以按软件方式(XON/XOFF握手)或硬件方式(一对单独的双绞线)实现。

RS-422的最大传输距离为1219米,最大传输速率为10Mb/s。

其平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能达到最大传输距离。

一般100米长的双绞线上所能获得的最大传输速率仅为1Mb/s。

RS-485是从RS-422基础上发展而来的,所以RS-485许多电气规定与RS-422相仿。

RS-485可以采用二线与四线方式,二线制可实现真正的多点双向通信,而采用四线连接时,与RS-422一样只能实现点对多的通信,即只能有一个主(Master)设备,其余为从设备,但它比RS-422有改进,无论四线还是二线连接方式总线上可多接到32个设备。

RS-485与RS-422的不同还在于其共模输出电压是不同的,RS-485是-7V至+12V之间,而RS-422在-7V至+7V之间,RS-485接收器最小输入阻抗为12kΩ、RS-422是4kΩ;由于RS-485满足所有RS-422的规范,所以RS-485的驱动器可以在RS-422网络中应用。

平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能使用规定最长的电缆长度。

笔者采用的RS-232串口通信协议。

目前较为常用的串口有9针串口(DB9)和25针串口(DB25),通信距离较近时(<12m),可以用电缆线直接连接标准RS232端口(RS422,RS485较远),若距离较远,需附加调制解调器(MODEM)或其他相关设备。

最为简单且常用的是三线制接法,即地、接收数据和发送数据三脚相连,这是最为基本的接法,且直接用RS232相连。

上面是对微机标准串行口而言的,还有许多非标准设备,不做说明。

硬件是可用的。

才能完成系统的自举。

笔者采用ootLoader是u-Boot-1.1.16。

Uboot是一个众所周知的开源软件。

仅对串口的连接和程序的作简要说明:将UBOOT目录下的u-boot.bin到开发平台上。

在笔记本上就可以看到串口的类似下面的输出。

这就是传说中的串口控制台。

这个串口的指令功能是由Uboot本身完成的。

并不是linux下的串口驱动。

引入此图旨在让读者感性的认识到串口控制台的功能是什么。

就是linux内核中几种2440芯片通用的串口发送函数s3c24xx_serial_start_tx。

最前面的linux是内核代码的根目录。

它是一个用C语言写成,符合POSIX标准的类Unix操作系统。

Linux最早是由芬兰Linus Torvalds为尝试在英特尔x86架构上自由免费的类Unix操作系统而开发的。

该计划开始于1991年,在计划的早期有一些Minix 了协助,而今天全球无数程序员正在为该计划无偿帮助。

“内核”指的是一个硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。

一个内核不是一套完整的操作系统。

一套基于Linux内核的完整操作系统叫作Linux操作系统,或是GNU/Linux。

Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置,并在系统运行期间可直接装载或卸载。

操作系统是一个用来和硬件打交道并为用户程序一个有限服务集的低级支撑软件。

一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。

计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。

但是没有软件来操作和控制它,自身是不能工作的。

完成这个控制工作的软件就称为操作系统,在Linux的术语中被称为“内核”,也可以称为“核心”。

Linux内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。

系统调用接口SCI 层了某些机制执行从用户空间到内核的函数调用。

正如前面讨论的一样,这个接口依赖于结构,甚至在相同的处理器家族内也是如此。

SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。

在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于结构的部分。

进程管理进程管理的重点是进程的执行。

在内核中,这些进程称为线程,代表了单独的处理器虚拟化(线程代码、数据、堆栈和 CPU寄存器)。

在用户空间,通常使用进程这个术语,不过 Linux 实现并没有区分这两个概念(进程和线程)。

内核通过 SCI 了一个应用程序编程接口(API)来创建一个新进程(fork、exec 或 Portable Operating System Interface [POSⅨ] 函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal 或者 POSⅨ机制)。

内核实现了一种新型的调度算法,不管有多少个线程在竞争 CPU,这种算法都可以在固定时间内进行操作。

这种算法就称为 O⑴调度程序,这个名字就表示它调度多个线程所使用的时间和调度一个线程所使用的时间是相同的。

您可以在 ./linux/kernel 中找到进程管理的源代码,在 ./linux/arch 中可以找到依赖于结构的源代码。

内存管理内核所管理的另外一个重要资源是内存。

为了提高效率,如果由硬管理虚拟内存,内存是按照所谓的内存页方式进行管理的(对于大部分结构来说都是 4KB)。

Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。

Linux 了对 4KB缓冲区的抽象,例如 slab 分配器。

这种内存管理模式使用 4KB缓冲区为基数,然后从中分配结构,并内存页使用情况,比如哪些内存页是满的,哪些页面没有完全使用,哪些页面为空。

为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。

内存管理的源代码可以在 ./linux/mm 中找到。

虚拟文件系统虚拟文件系统(VFS)是 Linux 内核中非常有用的一个方面,因为它为文件系统了一个通用的接口抽象。

VFS 在 SCI 和内核所支持的文件系统之间了一个交换层。

VFS 在用户和文件系统之间了一个交换层在 VFS 上面,是对诸如 open、close、read 和 write 之类的函数的一个通用 API 抽象。

在 VFS 下面是文件系统抽象,它定义了上层函数的实现方式。

它们是给定文件系统(超过 50 个)的插件。

文件系统的源代码可以在 ./linux/fs 中找到。

文件系统层之下是缓冲区缓存,它为文件系统层了一个通用函数集(与具体文件系统无关)。

这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要是就可用)优化了对物理设备的访问。

缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。

(./linux/driver/tty/serial/samsung.c)driver是驱动程序的目录。

如图所示:前文对linux设备驱动程序有了一个大概的描述。

下面我们具体看一下linux下的驱动。

纵览linux/drivers目录,大概还有35个以上的子目录,每个子目录基本上就代表了一种设备驱动,有atm、block、char、misc、input、net、usb、sound、video等。

这里只描述在嵌入式系统里面用得最为广泛的3种设备。

1.字符设备(char device)字符设备是Linux最简单的设备,可以像文件一样访问。

初始化字符设备时,它的设备驱动程序向Linux登记,并在字符设备向量表中增加一个device_struct数据结构条目,这个设备的主设备标识符用做这个向量表的索引。

一个设备的主设备标识符是固定的。

chrdevs向量表中的每一个条目,一个device_struct数据结构,包括两个元素:一个登记设备驱动程序名称的指针和一个指向一组文件操作的指针。

可以参考的代码是include/linux/ major.h。

2.块设备(block device)块设备是文件系统的物质基础,它也可以像文件一样被访问。

Linux用blkdevs向量表维护已经登记的块设备文件。

它像chrdevs向量表一样,使用设备的主设备号作为索引。

它的条目也是device_struct数据结构。

与字符设备不同的是,块设备分为SCSI类和IDE类。

一种块设备类的设备驱动程序向这种类和类相关的接口。

可以参考的代码是fs/devices.c。

每一个块设备驱动程序必须普通的文件操作接口和对于buffer cache的接口。

每一个块设备驱动程序填充blk_dev向量表中lk_dev_struct数据结构。

此向量表的索引是设备的主设备号。

其中blk_dev_struct数据结构包括一个请求例程的地址和一个指针,指向一个request数据结构的列表,每一个都表达buffer cache向设备读/写一块数据的一个请求。

可以参考的源代码是drivers/block/ll_rw_blk.c和include/linux/blkdev.h。

当buffer cache从一个已登记的设备读/写一块数据,或者希望读、写一块数据到其他位置时,就在blk_dev_struct中增加一个request数据结构。

每个request数据结构都有一个指向一个或多个buffer_head数据结构的指针,每一个都是读/写一块数据的请求。

如果buffer_head数据结构被锁定(buffer_cache),可能会有一个进程在等待这个缓冲区的阻塞进程完成。

每一个request数据结构都是从all_request表中分配的。

如果request增加到空的request列表中,就调用驱动程序的request函数处理这个request队列,否则驱动程序只是简单地处理request队列中的每一个请求。

块设备驱动程序和字符设备驱动程序的主要区别是:在对字符设备发出读、写请求时,实际的硬件I/O一般紧接着就发生了,块设备则不然,它利用一块系统内存作为缓冲区,当用户进程对设备请求能满足用户的要求时,就返回请求的数据,如果不能就调用请求函数来进行实际的I/O操作。

块设备是主要针对磁盘等慢速设备的,以免耗费过多的CPU时间来等待。

3.网络设备(net device)网络设备在系统中的作用类似于一个已挂载的块设备。

块设备将自己注册到blk_dev数据及其他内核结构中,然后通过自己的request函数在发生请求时传输和接收数据块,同样网络设备也必须在特定的数据结构中注册自己,以便与外界交换数据包时被调用。

网络设备在Linux里做专门的处理。

Linux的网络系统主要是基于BSD UNIX的Socket机制。

在系统和驱动程序之间定义有专门的数据结构(sk_buff)进行数据的传递。

系统里支持对发送数据和接收数据的缓存,流量控制机制,对多协议的支持。

4.杂项设备(misc device)杂项设备也是在嵌入式系统中用得比较多的一种设备驱动,在第11章里面介绍的sub LCD和弦芯片的驱动等都是采用 misc device 的驱动方式实现的。

在 Linux 内核的include\linux目录下有Miscdevice.件,要把自己定义的misc device从设备定义在这里。

其实是因为这些字符设备不符合预先确定的字符设备范畴,所有这些设备采用主编号10,一起归于misc device,其实misc_register就是用主标号10调用register_chrdev()的。

这是driver目录下的分类。

我们主要调研的串口驱动。

tty一词源于Teletypes,或Teletypewriters,它是最早出现的一种终端设备,类似电传打字机,由Teletype公司生产。

最初tty是指连接到Unix系统上的物理或者虚拟终端。

终端是一种字符型设备,通常使用tty来统称各种类型的终端设备。

随着时间的推移,当通过串行口能够建立起终端连接后,这个名字也用来指任何的串口设备。

它还有多种类,例如串口(ttySn、ttySACn、ttyOn)、USB到串口的转换器(ttyUSBn),还有需要特殊处理才能正常工作的调制解调器(比如传统的WinModem类设备)等。

其实起初终端和控制台都不是个人电脑的概念,而是多人共用的小型中型大型计算机上的概念。

终端为主机了人机接口,每个人都通过终端使用主机的资源。

控制台是一种特殊的人机接口, 是人控制主机的第一人机接口。

对此还可以结合内核启动代码中init进程打开/dev/console和执行两次sys_dup(0),以及标准输入、标准输出、标准出错,还有就是进程fork后的标准输入输出的复制情况来一起理解。

但是linux按POSIX标准把个人计算机当成小型机来用,在控制台上通过getty软件虚拟了六个字符哑终端(或者叫虚拟控制台终端tty1-tty6)(数量可以在/etc/inittab里自己调整)和一个图型终端, 在虚拟图形终端中又可以通过软件(如rxvt)再虚拟无限多个伪终端(pts/0等)。

所以在个人计算机上,只有一个实际的控制台,没有终端,所有终端都是在控制台上用软件模拟的。

要把个人计算机当主机再通过串口或网卡外连真正的物理终端也可以,论成本,呵呵。

终端按照其自身能力分类,可以分为:1、哑终端(瘦客户端)早期的计算机终端是通过串行RS-232通信的,它只能解释有限数量的控制码(CR,LF等),但没有能力处理执行特殊的转义序列功能(如清行、清屏或控制光标的位置)。

简单来说就是处理能力有限的终端机,他们一般基本上只具有和机械电传打字机类似的有限功能。

哑终端有时用来指任何类型的通过RS-232连接的传统计算机终端,不对数据进行本地处理或本地执行用户程序的串行通信终端。

哑终端有时也指功能有限,只有单色文本处理能力或直接传输每一个键入的字符而不等待主机轮询的公共计算机终端。

2、智能终端(胖客户端)智能终端就是有能力处理转义序列,也就是说处理能力较强的终端机。

Linux系统的终端设备一般有以下几种:1、 控制台系统控制台/dev/console/dev/console是系统控制台,是与操作系统交互的设备。

系统所产生的信息会发送到该设备上。

平时我们看到的PC只有一个屏幕和键盘,它其实就是控制台。

console有缓冲的概念,为内核打印输出。

内核把要打印的内容装入缓冲区__log_buff,然后由console来决定打印到哪里(比如是tty0还是ttySn等)。

console指向的终端。

历史上,console指主机本身的屏幕和键盘,而tty指用电缆链接的其它位置的控制台。

某些情况下console和tty0是一致的,就是当前所使用的是虚拟终端,也是虚拟终端。

所以有些资料中称/dev/console是到/dev/tty0的符号链接,但是这样说现在看来是不对的:根据内核文档,在2.1.71之前,/dev/console根据不同系统设定,符号链接到/dev/tty0或者其他tty*上,在2.1.71版本之后则完全由内核代码内部控制它的映射。

如果一个终端设备要实现console功能,必须向内核注册一个struct console结构,一般的串口驱动中都会有。

如果设备要实现tty功能,必须要内核的tty子系统注册一个struct tty_driver结构,注册函数在drivers/tty/tty_io.c中。

一个设备可以同时实现console和tty_driver,一般串口都这么做。

当前控制台:/dev/tty这是应用程序中的概念,如果当前进程有控制终端(Coolling Terminal),那么/dev/tty就是当前进程控制台的设备文件。

对于你登录的shell,/dev/tty就是你使用的控制台,设备号是(5,0)。

不过它并不指任何物理意义上的控制台,/dev/tty会映射到当前设备(使用命令“tty”可以查看它具体对应哪个实际物理控制台设备)。

输出到/dev/tty的内容只会显示在当前工作终端上(无论是登录在ttyn中还是pty中)。

你如果在控制台界面下(即字符界面下)那么dev/tty就是映射到dev/tty1-6之间的一个(取决于你当前的控制台号),但是如果你现在是在图形界面(Xwindows),那么你会发现现在的/dev/tty映射到的是/dev/pts的伪终端上。

/dev/tty有些类似于到实际所使用终端设备的一个联接。

在当前终端中输入 echo “tekkaman” > /dev/tty ,都会直接显示在当前的终端中。

虚拟控制台 /dev/ttyn/dev/ttyn是进程虚拟控制台,他们共享同一个真实的物理控制台。

如果在进程里打开一个这样的文件且该文件不是其他进程的控制台时,那该文件就是这个进程的控制台。

可能是Linux没有继承UNIX这方面的传统罢了。

看起来感觉存在多个屏幕,这种虚拟控制台对应tty1~n,其中:/dev/tty1等代表第一个虚拟控制台例如当使用ALT+F2进行切换时,系统的虚拟控制台为/dev/tty2 ,当前控制台(/dev/tty)则指向/dev/tty2在UNIX系统中,计算机显示器通常被称为控制台(Console)。

它仿真了类型为Linux的一种终端,并且有一些设备特殊文件与之相关联:tty0、tty1、tty2等。

当你在控制台上登录时,使用的是tty1。

读者可以登录到不同的虚拟控制台上去,因而可以让系统同时有几个不同的会话存在。

而比较特殊的是/dev/tty0,他代表当前虚拟控制台,其实就是当前所使用虚拟控制台的一个别名。

因此不管当前正在使用哪个虚拟控制台(注意:这里是虚拟控制台,不包括伪终端),系统信息都会重定位到/dev/tty0上。

tty0是系统自动打开的,但不用于用户登录。

在Framebuffer设备没有启用的系统中,可以使用/dev/tty0访问显卡。

2、 伪终端pty(pseudo-tty)伪终端(Pseudo Terminal)是终端的发展,为满足现在需求(比如网络登陆、xwindow窗口的管理)。

它是成对出现的逻辑终端设备(即master和sle设备, 对master的操作会反映到sle上)。

它多用于模拟终端程序,是远程登陆(telnet、ssh、xterm等)后创建的控制台设备。

历史上,有两套伪终端软件接口:BSD接口:较简单,master为/dev/pty [p-za-e] [0-9a-f];sle为 /dev/tty [p-za-e] [0-9a-f] ,它们都是配对的出现的。

但由于在编程时要找到一个合适的终端需要逐个尝试,所以逐渐被放弃。

Unix 98接口:使用一个/dev/ptmx作为master设备,在每次打开操作时会得到一个master设备fd,并在/dev/pts/目录下得到一个sle设备(如 /dev/pts/3和/dev/ptmx),这样就避免了逐个尝试的麻烦。

由于可能有好几千个用户登陆,所以/dev/pts/* 是动态生成的,不象其他设备文件是构建系统时就已经产生的硬盘节点(如果未使用devfs、udev、mdev等) 。

我们在X Window下打开的终端或使用telnet或ssh等方式登录Linux主机,此时均通过pty设备。

例如,如果某人在网上使用telnet程序连接到你的计算机上,则telnet程序就可能会打开/dev/ptmx设备获取一个fd。

此时一个getty程序就应该运行在对应的/dev/pts/* 上。

当telnet从远端获取了一个字符时,该字符就会通过ptmx、pts/* 传递给 getty程序,而getty程序就会通过pts/* 、ptmx和telnet程序往网络上返回“login:”字符串信息。

telnet<--->/dev/ptmx(master)<--->pts/*(sle)<--->getty如果一个程序把 pts/* 看作是一个串行端口设备,则它对该端口的读/写操作会反映在该逻辑终端设备对的另一个/dev/ptmx上,而/dev/ptmx则是另一个程序用于读写操作的逻辑设备。

这样,两个程序就可以通过这种逻辑设备进行互相交流,这很象是逻辑设备对之间的管道操作。

对于pts/* ,任何设计成使用一个串行端口设备的程序都可以使用该逻辑设备。

但对于使用/dev/ptmx的程序,则需要专门设计来使用/dev/ptmx逻辑设备。

通过使用适当的软件,就可以把两个甚至多个伪终端设备连接到同一个物理串行端口上。

3、 串口终端(/dev/ttySn)串行端口终端(Serial PortTerminal)是使用计算机串行端口连接的终端设备。

有段时间串行端口设备通常被称为终端设备,那时它的最大用途就是用来连接终端,所以这些串行端口所对应的设备名称是/dev/tts/0(或/dev/ttyS0)、/dev/tts/1(或/dev /ttyS1)等,设备号分别是(4,0)、(4,1)等(对应于win系统下的COM1、COM2等)。

我们可以在命令行提示符下键入:echotekkaman> /dev/ttyS1会把“tekkaman”发送到连接在ttyS1(COM2)端口的设备上。

在2.6以后的内核后、一些三星的芯片将串口终端设备节点命名为ttySACn。

TI的Omap系列芯片从2.6.37开始芯片自带的UART设备开始使用专有的的omap-uart驱动,故设备节点命名为ttyOn,以区别于使用8250驱动时的设备名“ttySn”。

4、 其它类型终端还针对很多不同的字符设备存在有很多其它种类的终端设备特殊文件,例如针对ISDN设备的/dev/ttyIn终端设备等。

因为我们和开发板的人机交互的接口是Windows下的串口控制台。

这就是上面所说的控制台终端。

如图所示:我们主要关心的是两类文件。

一类是与结构和板载资源无关的通用串口操作文件。

(samsung.c)一类是与结构相关的硬件操作文件。

(s3c2440.c s3c2410.c s5pv210.c等),我们为了得到具体的调用链。

在具体的发送函数中加入回溯。

这些函数基本上都是通过结构体中的函数指针调用。

是对整个tty设备的抽象。

对用户统一的接口。

是对传输数据的格式化。

是面向tty设备的硬件驱动。

这里面真正的对硬件进行操作。

介绍linux内核中针对于这一个串口硬件的主要数据结构。

封装了tty_driver,使得底层的UART驱动无需关心tty_driver具体定义如下。

uart_portuart_port用于描述一个UART端口(直接对应于一个串口)的I/O端口或者IO内存地址等信息。

uart_ops定义了针对UART的一系列操作。

uart_ops结构是我们这里的数据结构。

而uart_ops变量则是一个tty_operations的变量。

在serial_core.c中定义了tty_operations的实例。

即uart_ops变量,包含uart_open();uart_close();uart_send_xchar()等成员函数,这些函数借助uart_ops结构体中的成员函数来完成具体的操作:uart_ops变量是tty_operations型的一个变量。

如下图所示:uart_state是uart的状态结构。

uart_info是uart的信息结构。

用数据结构来描述函数调用链就是uart_driver ->uart_state->uart_port->uart_ops->特定的函数指针。

大致的初始化流程如下图所示:打开设备和初始化流程类似。

如图所示:同理数据的发送和接收如图所示:这里我们需要注意的是。

用户从write系统调用传下来的数据就会写入这个UTXH0寄存器。

这是ARM11的):如下才是发送中断的ISR(Interrupt Service Routine)中断服务例程。

一个irqreturn_t类型的handler。

这个wr_regb(port, S3C2410_UTXH, port->x_char);就是往特定寄存器写的过程。

相信读者对于Linux下的tty子系统已经有一个概观了。

下面是这个uart驱动的总图。

Linux内核完成了驱动模型和特定硬件的分离:串口驱动数据结构总图:原文:https://www.jianshu.com/p/3a9013b9569c作者:Linkerist免责声明:本文内容来源于网络,文章版权归原作者所有,意在传播相关技术知识&行业趋势,供大家学习交流,若涉及作品版权问题,请联系删除或授权事宜。


以上是文章"

设备与设备文件(device):与系统外设及存储等相关的一些文件,

"的内容,欢迎阅读网控科技网的其它文章