linux怎么看tty连接哪个端口,Linux TTY framework(4)_TTY driver

本文介绍了Linux TTY框架中TTY设备的管理方式,重点讲解了TTY driver的数据结构struct tty_driver,包括driver_name、name、major、minor_start等字段,并阐述了TTY struct和TTY port的作用。此外,还提到了TTY操作函数集struct tty_operations及编写TTY driver的基本步骤。
摘要由CSDN通过智能技术生成

Linux TTY framework(4)_TTY driver

作者:wowo 发布于:2016-10-25 22:40

分类:TTY子系统

1. 前言

本文将从驱动工程师的角度去看TTY framework:它怎么抽象、管理各个TTY设备?它提供了哪些编程接口以方便TTY driver的开发?怎么利用这些接口编写一个TTY driver?等等。

注1:话说介绍各个framework的时候,我一直比较喜欢用provider、consumer等概念,因为非常生动、易懂。不过在TTY framework的官方俗语中,压根没有provider、consumer等概念,为了不混淆试听,就算了吧。

注2:TTY framework在Linux kernel中算得上一个比较繁琐、庞杂的framework了,再加上现在很少有人会直接去写一个TTY driver,因此本文只是介绍一些概念性的东西,以加深对TTY及其driver的理解,为后续学习serial framework打基础。一些细节的东西,大家可参考callme_friend同学写的"TTY驱动分析[2]”,特别是其中的一些图示,很清晰!

注3:本文所使用的kernel版本为“X Project”初始的“Linux 4.6-rc5”版本。

2. 关键数据结构

注4:阅读本章内容时可对照callme_friend画的的TTY个数据结构的关系图[3]以加深理解。

2.1 TTY device

Linux TTY framework的核心功能,就是管理TTY设备,以方便应用程序使用。于是,问题来了,Linux kernel是怎么抽象TTY设备的呢?答案很尴尬,kernel并不认为TTY device是一个设备,这很好理解:

比如,我们熟悉的串口终端,串口控制器(serial controller)是一个实实在在的硬件设备,一个控制器可以支持多个串口(serial port),软件在串口上收发数据,就相当于在驱动“串口终端”。此处的TTY device,就是从串口控制器中抽象出来的一个数据通道;

再比如,我们常用的网络终端,只有以太网控制器(或者WLAN控制器)是实实在在的设备,sshd等服务进程,会基于网络socket,虚拟出来一个数据通道,软件在这个通道上收发数据,就相当于在驱动“网络终端”。

因此,从kernel的角度看,TTY device就是指那些“虚拟的数据通道”。

另外,由于TTY driver在linux kernel中出现的远比设备模型早,所以在TTY framework中,没有特殊的数据结构用于表示TTY设备。当然,为了方便,kernel从设备模型和字符设备两个角度对它进行了抽象:

1)设备模型的角度

为每个“数据通道”注册了一个stuct device,以便可以在sysfs中体现出来,例如:

/sys/class/tty/tty

/sys/class/tty/console

/sys/class/tty/ttyS0

2)字符设备的角度

为每个“数据通道”注册一个struct cdev,以便在用户空间可以访问,例如:

/dev/tty

/dev/console

/dev/ttyS0

2.2 TTY driver

从当前设备模型的角度看,TTY framework有点奇怪,它淡化了device的概念(参考2.1的介绍),却着重突出driver。由struct tty_driver所代表的TTY driver,几乎大包大揽了TTY device有关的所有内容,如下:

struct tty_driver {

int     magic;          /* magic number for this structure */

struct kref kref;       /* Reference management */

struct cdev **cdevs;

struct module   *owner;

const char      *driver_name;

const char      *name;

int     name_base;      /* offset of printed name */

int     major;          /* major device number */

int     minor_start;    /* start of minor device number */

unsigned int    num;    /* number of devices allocated */

short   type;           /* type of tty driver */

short   subtype;        /* subtype of tty driver */

struct ktermios init_termios; /* Initial termios */

unsigned long   flags;          /* tty driver flags */

struct proc_dir_entry *proc_entry; /* /proc fs entry */

struct tty_driver *other; /* only used for the PTY driver */

/*

* Pointer to the tty data structures

*/

struct tty_struct **ttys;

struct tty_port **ports;

struct ktermios **termios;

void *driver_state;

/*

* Driver methods

*/

const struct tty_operations *ops;

struct list_head tty_drivers;

}

原则上来说,在编写TTY driver的时候,我们只需要定义一个struct tty_driver变量,并根据实际情况正确填充其中的字段后,注册到TTY core中,即可完成驱动的设计。当然,我们不需要关心struct tty_driver中的所有字段,下面我们捡一些重点的字段一一说明。

1)需要TTY driver关心的字段

driver_name,该TTY driver的名称,在软件内部使用;

name,该TTY driver所驱动的TTY devices的名称,会体

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值