Linux设备模型之tty驱动架构分析.pdfVIP

  • 11
  • 0
  • 约1.52万字
  • 约 16页
  • 2019-03-31 发布于江苏
  • 举报
Linux 设备模型之tty 驱动架构分析 一:前言 Tty 这个名称源于电传打字节的简称。在linux 表示各种终端。终端通常都跟硬件相对应。比如对应于输入设备键盘鼠标。输出 设备显示器的控制终端和串口终端.也有对应于不存在设备的pty 驱动。在如此众多的终端模型之中,linux 是怎么将它们统一 建模的呢?这就是我们今天要讨论的问题. 二:tty 驱动概貌 Tty 架构如下所示: 如上图所示,用户空间主要是通过设备文件同tty_core 交互.tty_core 根据用空间操作的类型再选择跟line discipline 和 tty_driver 交互.例如设置硬件的ioctl 指令就直接交给tty_driver 处理。Read 和write 操作就会交给line discipline 处理. Line discipline 是线路规程的意思。正如它的名字一样,它表示的是这条终端”线程” 的输入与输出规范设置.主要用来进行输入 /输出数据的预处理。处理之后。就会将数据交给tty_driver Tty_driver 就是终端对应的驱动了。它将字符转换成终端可以理解的字串.将其传给终端设备。 值得注意的是,这个架构没有为tty_drivero 提供read 操作。也就是说tty_core 和line discipline 都没有办法从tty_driver 里直接读终端信息。这是因为tty_driver 对就的hardware 并不一定是输入数据和输出数据的共同负载者。例如控制终端,输 出设备是显示器。输入设备是键盘。基于这样的原理。在line discipline 中有一个输入缓存区。并提供了一个名叫receive_buf() 的接口函数。对应的终端设备只要调用line discipine 的receiver_buf 函数,将数据写入到输入缓存区就可以了。 如果一个设备同时是输入设备又是输出设备。那在设备的中断处理中调用receive_buf()将数据写入即可. 三:tty 驱动接口分析 具体的tty 驱动设计可以参考LDD3。这里只对它的接口实现做一个分析.tty driver 的所有操作都包含在tty_driver 中。内核 即供了一个名叫alloc_tty_driver()来分配这个tty_driver。当然我们也可以在自己的驱动中将它定义成一个静态的结构。对 tty_driver 进行一些必要的初始化之后,调用tty_register_driver()将其注册. alloc_tty_driver()接口代码如下所示: struct tty_driver *alloc_tty_driver(int lines) { struct tty_driver *driver; driver = kzalloc(sizeof(struct tty_driver), GFP_KERNEL); if (driver) { driver-magic = TTY_DRIVER_MAGIC; driver-num = lines; /* later well move allocation of tables here */ } return driver; } 这个函数只有一个参数。这个参数的含义为line 的个数。也即次设备号的个数。注意每个设备文件都会对应一个line. 在这个接口里为tty_driver 分配内存,然后将driver-mage.driver-num 初始化之后就返回了. tty_register_driver()用来注册一个tty_driver。代码如下: int tty_register_driver(struct tty_driver *driver) { int error; int i; dev_t dev; void **p = NULL; //TTY_DRIVER_INSTALLED: 已安装的 if (driver-flags TTY_DRIVER_INSTALLED) return 0; //TTY_DRIVER_DEVPTS_MEM:使用devpts 进行动态内存映射 if (!(driver-flags TTY_DRIVER_DEVPTS_MEM) driver-nu

文档评论(0)

1亿VIP精品文档

相关文档