第14章 Linux终端设备驱动之终端设备

本章知识点

        在 Linux 系统中,终端设备非常重要,没有终端设备,系统将无法向用户反馈信息,Linux 中包含控制台、串口和伪终端 3 类终端设备。

    1、终端设备的概念及分类, Linux 终端设备驱动的框架架构,重点描述 tty_driver 结构体及其成员。

    2、 Linux 终端设备驱动模块加载/卸载函数和 open()、close()函数,数据读写流程及 tty 设备线路设置的编程方法。

    3、在 Linux 中,串口驱动完全遵循 tty 驱动的框架结构,但是进行了底层操作的再次封装,串口 tty 驱动的实现方法。

    4、串口 tty 驱动的设计实例。

14.1 终端设备

    在 Linux 系统中,终端是一种字符型设备,通常使用 tty 来简称各种类型的终端设备。tty 是 Teletype 的缩写,Teletype 是最早出现的一种终端设备,很像电传打字机,由 Teletype公司生产的。Linux 中包含如下几类终端设备。

    1、串行端口终端(/dev/ttySn)

    串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。以Ubuntu为例,这些串行端口所对应的设备名称是/dev/ttyS0(或/dev/tts/0)、/dev/ttyS1

(或/dev/tts/1)等,设备号分别是(4,64)、(4,65)等。

    在命令行上把标准输出重定向到端口对应的设备文件名上就可以通过该端口发送数据,例如,在命令行提示符下键入:

    echo “hello” >  /dev/ttyS1 会把“hello”发送到连接在 ttyS1 端口的设备上。

    目前 USB-串口转换器已经非常常用,其对应设备结点通常为/dev/ttyUSB0、/dev/ttyUSB1 等。

    2、伪终端(/dev/pty)

    伪终端 pty(Pseudo Terminal)是成对的逻辑终端设备,并存在成对的设备文件,如/dev/ptyp3和

/dev/ttyp3,它们与实际物理设备并不直接相关。如果一个程序把 ttyp3 看作是一个串行端口设备,则程序对该端口的读/写操作会反映在该逻辑终端设备对应的 ttyp3 上,而 ttyp3 则是另一个程序用于读写操作的逻辑设备。这样,两个程序就可以通过这种逻辑设备进行互相交流,使用 ttyp3的程序会认为自己正在与一个串行端口进行通信。

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

    目前的 Linux 版本常采用 pts(pseudo-terminal slave 伪终端从设备)ptmx(pseudo-terminal master伪终端主设备)配合的方法来实现伪终端(pty)。目录 /dev/pts 是一个类型为 devpts 的文件系统,并且可以在被加载文件系统列表中看到。以Ubuntu为例:


/dev/ptmx 是 1 个主设备号为 5,次设备号为 2 的字符设备。以Ubuntu为例:

crw-rw-rw-  1 root tty       5,   2 Jun 13 17:27 ptmx

/dev/ptmx被用于创建一个master/slave 对。当某进程打开/dev/ptmx时,该进程将得到一个 master 的文件描述符,每个被打开的文件描述符对应一个独立的 master,而且对应一个 pts(伪终端从设备),将该文件描述符作为参数传入 ptsname可以得到 pts (伪终端从设备)的路径。

3.控制终端(/dev/tty)

    如果当前进程有控制终端(Controlling Terminal),那么/dev/tty 就是当前进程的控制终端的设备特殊文件。使用“ps ax”命令来查看进程与哪个控制终端相连。

lihacker@lihacker-laptop:/$ ps ax

PID TTY STAT TIME COMMAND

1 ? Ss 0:06 /sbin/init
2 ? S< 0:00 [kthreadd]
3 ? S< 0:00 [migration/0]
...
783 ? S<s 0:02 /sbin/udevd --daemon
995 ? S< 0:00 [kpsmoused]
...
2012 tty4 Ss+ 0:00 /sbin/getty 38400 tty4
2013 tty5 Ss+ 0:00 /sbin/getty 38400 tty5
2019 tty2 Ss+ 0:00 /sbin/getty 38400 tty2
2021 tty3 Ss+ 0:00 /sbin/getty 38400 tty3
2022 tty6 Ss+ 0:00 /sbin/getty 38400 tty6
2093 ? Ss 0:00 /usr/sbin/acpid -c /etc/acpi/events -s
/var/run/acpid.socket
...
4075 pts/0 Ss 0:03 bash
4580 pts/1 Ss 0:01 bash
4596 pts/1 S+ 0:00 ssh lihacker@10.0.2.15
4597 ? Ss 0:00 sshd: lihacker [priv]
4606 ? S 0:00 sshd: lihacker@pts/2
4608 pts/2 Ss+ 0:01 -bash

4952 pts/0 R+ 0:00 ps ax

分析:内核线程(如 kthreadd)和用户空间的守护进程(如 udevd)没有控制终端,因此其 tty栏目标注的是“?”。

使用命令“tty”可以查看它具体对应哪个实际终端设备。

ubuntu2018@ubuntu2018:/$ tty
/dev/pts/11

4.控制台终端(/dev/ttyn,/dev/console)

    在 UNIX 系统中,计算机显示器通常被称为控制台终端(console)。它仿真了类型为 Linux的一种终端(TERM=Linux),并且有一些设备特殊文件与之相关联:tty0、tty1、tty2 等。当用户在控制台上登录时,使用的是 tty1。使用 Alt+[F1~F6]组合键时,可以切换到 tty2、tty3 等上面去。tty1~tty6 等称为虚拟终端,而 tty0 则是当前所使用虚拟终端的一个别名,系统所产生的信息会发送到该终端上。不管当前正在使用哪个虚拟终端,系统信息都会发送到控制台终端上。用户可以登录到不同的虚拟终端上去,因而可以让系统同时有几个不同的会话期存在。只有系统或超级用户 root 可以向/dev/tty0 进行写操作。

    在 Linux 中,可以在系统启动命令行里指定当前的输出终端,格式如下:

    console=device, options

    device 指的是终端设备,可以是 tty0(前台的虚拟终端)ttyX(第 X 个虚拟终端)ttySX(第 X 个串口)lp0(第一个并口)等。

    options 是指对 device 进行的设置,取决于具体的设备驱动。对于串口设备,参数用来定义为:波特率、校验位、位数,格式为 BBBBPN,其中 BBBB 表示波特率,P 表示校验(n/o/e),N表示位数,默认 options 是 9600n8。

    用户可以在内核命令行中同时设定多个 console,输出将会在所有的 console 上显示,当用户调用 open()打开/dev/console 时,最后一个 console 将会返回作为当前值。例如:

    console=ttyS1, 9600 console=tty0

    定义两个 console,调用 open()打开/dev/console 时,将使用虚拟终端 tty0。但内核消息会在 tty0 虚拟终端和串口 ttyS1 上同时显示。

    通过查看/proc/tty/drivers 文件可以获知什么类型的 tty 设备存在以及什么驱动被加载到内核,这个文件包括一个当前存在的不同 tty 驱动的列表,包括驱动名、缺省的节点名、驱动的主编号、这个驱动使用的次编号范围,以及 tty 驱动的类型

ubuntu2018@ubuntu2018:/proc/tty$ cat drivers


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值