欢迎来到天天文库
浏览记录
ID:15390882
大小:353.50 KB
页数:15页
时间:2018-08-03
《linux设备模型之tty驱动架构分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Linux设备模型之tty驱动架构分析------------------------------------------本文系本站原创,欢迎转载!转载请注明出处:http://ericxiao.cublog.cn/------------------------------------------一:前言Tty这个名称源于电传打字节的简称。在linux表示各种终端。终端通常都跟硬件相对应。比如对应于输入设备键盘鼠标。输出设备显示器的控制终端和串口终端.也有对应于不存在设备的pty驱动。在如此众多的终端模型之中,linux是怎么将它们统
2、一建模的呢?这就是我们今天要讨论的问题.二:tty驱动概貌Tty架构如下所示:如上图所示,用户空间主要是通过设备文件同tty_core交互.tty_core根据用空间操作的类型再选择跟linediscipline和tty_driver交互.例如设置硬件的ioctl指令就直接交给tty_driver处理。Read和write操作就会交给linediscipline处理.Linediscipline是线路规程的意思。正如它的名字一样,它表示的是这条终端”线程”的输入与输出规范设置.主要用来进行输入/输出数据的预处理。处理之后。就会将数据交给
3、tty_driverTty_driver就是终端对应的驱动了。它将字符转换成终端可以理解的字串.将其传给终端设备。值得注意的是,这个架构没有为tty_drivero提供read操作。也就是说tty_core 和linediscipline都没有办法从tty_driver里直接读终端信息。这是因为tty_driver对就的hardware并不一定是输入数据和输出数据的共同负载者。例如控制终端,输出设备是显示器。输入设备是键盘。基于这样的原理。在linediscipline中有一个输入缓存区。并提供了一个名叫receive_buf()的接口
4、函数。对应的终端设备只要调用linediscipine的receiver_buf函数,将数据写入到输入缓存区就可以了。如果一个设备同时是输入设备又是输出设备。那在设备的中断处理中调用receive_buf()将数据写入即可. 三:tty驱动接口分析具体的tty驱动设计可以参考LDD3。这里只对它的接口实现做一个分析.ttydriver的所有操作都包含在tty_driver中。内核即供了一个名叫alloc_tty_driver()来分配这个tty_driver。当然我们也可以在自己的驱动中将它定义成一个静态的结构。对tty_driver进
5、行一些必要的初始化之后,调用tty_register_driver()将其注册.alloc_tty_driver()接口代码如下所示:15structtty_driver*alloc_tty_driver(intlines){ structtty_driver*driver; driver=kzalloc(sizeof(structtty_driver),GFP_KERNEL); if(driver){ driver->magic=TTY_DRIVER_MAG
6、IC; driver->num=lines; /*laterwe'llmoveallocationoftableshere*/ } returndriver;}这个函数只有一个参数。这个参数的含义为line的个数。也即次设备号的个数。注意每个设备文件都会对应一个line.在这个接口里为tty_driver分配内存,然后将driver->mage.driver->num初始化之后就返回了. tty_register_driver()用来注册一个
7、tty_driver。代码如下:inttty_register_driver(structtty_driver*driver){ interror; inti; dev_tdev; void**p=NULL; //TTY_DRIVER_INSTALLED:已安装的 if(driver->flags&TTY_DRIVER_INSTALLED) return0; //TTY_DRIVER_DEVPTS_ME
8、M:使用devpts进行动态内存映射 if(!(driver->flags&TTY_DRIVER_DEVPTS_MEM)&&driver->num){ p=k
此文档下载收益归作者所有