orange's学习--第九章:将TTY纳入文件系统

原来的TTY仅仅是一个进程每隔一个时间片就把输入输出显示到屏幕上,无法把输入传递给用户进程,将TTY纳入到文件系统后,用户进程就可以获得键盘输入了。

我们不妨先来想像一下TTY和文件系统连接后的情形。从用户的角度来看,读写TTY和读写普通文件将不会有差别,都是通过调
用read(  )和write(  )来实现。普通文件和特殊文件的分辨是由文件系统来完成的,而且我们在实现文件系统时已经编写了一点代
码了。

写入TTY跟写入普通文件是很类似的,不同之处只是在于TTY不需要进行任何端口操作,只是写入显存就可以了。而对于读出操作,TTY和普通文件则有着很大不同。TTY收到进程读请求的消息之后并不能马上返回数据,因为此时还没有任何输入呢,这时候需要用户输入字符,等输入结束之后,TTY才可以返回给进程。这个过程使我们面临两个问题。一是怎样才算是“输入结束”,是每
一次键盘敲击之后都算结束呢,还是等敲回车才算结束,或者其他;二是是否要让文件系统等待输入过程结束。

对于第一个问题,面向字符和面向行的需求是分别存在的,我们这里只实现熟模式,也就是说,每次等回车出现,才算完成一次输入。第二个问题的答案比较明显。由于键盘输入可能耗时很久,这段时间内我们当然不能让文件系统闲着,可能有一大堆的进程想
要读写磁盘文件呢,所以TTY需要马上向文件系统发送消息以示返回。而文件系统则完全应该阻塞想要得到输入的进程,一直到输
入结束。

这两个问题解决,我们就大致上了解了读写TTY的过程了。假设进程P要求读取TTY,它会发送消息给文件系统,文件系统将消息传递给TTY,TTY记下发出请求的进程号等信息之后立即返回,而文件系统这时并不对P解除阻塞,因为结果还未准备好。在接下来的过程中,文件系统像往常一样等待来自任何进程的请求。而TTY则会将键盘输入复制进P传入的内存地址,一旦遇到回车,TTY就告诉文件系统,P的请求已被满足,文件系统会解除对P的阻塞,于是整个读取工作结束。
写TTY的过程则很简单。P发消息给文件系统,文件系统传递给TTY,TTY收到消息后立即将字符写入显存(保持P和FS进程的阻塞),完成后发消息给文件系统,文件系统再发消息给P,整个过程结束。

作为驱动程序,TTY接收并处理DEV_OPEN、DEV_READ和DEV_WRITE消息,这跟硬盘驱动是类似的。

DEV_OPEN基本上是个摆设,收到此消息我们直接返回,因为实在没有什么可OPEN的。DEV_READ和DEV_WRITE分别由对应的函数tty_do_read()和tty_do_write()来处理。从tty_do_read(  )的内容可以看出,结构体TTY的成员增加了若干,因为我们要保存发送读请求的进程的一些信息。在tty_do_read( )将结构体的这些成员赋值之后,马上向文件系统发送了一SUSPEND_PROC消息,文件系统需要处理它。文件系统在收到SUSPEND_PROC消息之后,并不像处理完READ或WRITE消息之后那样向进程P发送消息,而是不理不睬,径自开始下一个消息处理的循环,留下P独自等待。一直到TTY发送了RESUME_PROC消息,文件系统才会通知P,让它继续运行。

TTY处理完DEV_READ消息之后,来到第84行继续下一个循环,这里tty_dev_read( )将从键盘缓冲区将字符读入,在接下来的tty_dev_write(  )中,这些字符将被送入进程P的缓冲区,直到读入一个回车(\n)或者已经传输了足够多的字符(由tty_left_cnt指定)。注意,传输字符的过程并非在一个循环中就可以完成,因为人的手很慢而机器处理的速度很快。那么问题随之出现了,如果这时没有人给TTY发消息,TTY就会在第91行永远等下去,即便我们敲了再多字符,TTY也不加理会了,这可不行。所以我们还是用TASK_HD中使用的方法,借助从不停歇的时钟中断来唤醒TTY。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值