linux 0.11之tty

其实一直以来对/dev/tty* ./dev/tty,之类的文件就很有点疑惑。今天阅读了linux0.11相关的源码,了解了一下。

在linux0.11内核中字符设备只有三个(两种),一个是控制台设备(我理解就是本机的显示屏和键盘),另外两个是串行端口的串行终端设备。在内核中三个设备用一个tty_struct数组存储。tty_struct中我觉得离应用比较近的就是tty读队列和tty写队列两个主要成员。应用程序从指定的设备文件读取数据或是写入时,在底层实际都是通过对这两个对立操作完成.

我们在编程中使用open()打开指定设备文件,根据设备文件的类型选择读写函数。调用顺序是调用rw_char(READ,dev,buf,count,pos)。根据设备的主设备号,调用char_dev.c中的函数,linux0.11只提供了主设备号为4和5两个读写函数,分别是rw_tty(),rw_ttyx(),书上注释rw_ttyx是串口终端读写函数,rw_tty()是终端读写操作函数。其实实现上并没有太大不同,只是在函数rw_tty中会判断当前进程是否有对应的控制终端,,若有的话则调用rw_ttyx(),但是rw_ttyx中的参数Minor是从current->tty得来。在rw_ttyx函数中根据度读写动作调用tty_io.c 中的对应的读写函数tty_read 和tty_write.在tty_read和tty_write中就是根据minor参数执行的索引在上面说的tty_struct数组中需找tty_struct,读取tty读队列,写入tty写队列。

举例来说读取/dev/tty(在linux0.11下是一个主设备号为5,此设备号为0的字符设备),因为主设备号5,所以调用的是rw_tty,在rw_tty中检查当前进程的tty是否存在(current->tty>=0),若存在则使用该tty作为子设备号,调用函数读取控制台设备,两个串行端口的串行端口设备中的一个的读队列。调用结束。

写的比较乱,总结一下,如果主设备号为5则会根据次设备号读取或写入设备数组中的设备的队列,如果主设备号为4则会根据当前进程的tty作为次设备号操作设备数组中相应设备的队列。

ps:较高版本的内核的tty有鉴于本人水平不够,就不分析了,后面如果知道了会补上。Mark安静


你可能感兴趣的:(编程,linux,struct,存储,终端)