输入输出系统总结

最近在学习操作系统的开发过程中,到了输入输出系统了,但是由于输入输出系统这部分,思路很简单,但又过程很繁杂,鉴于时间有限,所以决定先跳过自己动手写的过程,只是将书写的思路记录于下,以备以后查阅,待其他更加重要的部分完成后,再回头来试着自己动手完成输入输出系统这部分。

TTY模型是很不错的输入输出模型完成后面的后,一定要回头来写一下这个模型(MVC?)。职责分工分明,层次清晰。

  • tty负责管理不同的切面。包括与下层键盘缓冲的通信,每个tty的缓冲的控制。
  • console负责显示,根据tty传过来的char进行相应的显示动作的改变。滚屏,删除,换行,切屏。

键盘:

这里主要是完成键盘的 扫描码-------->ASCII的转换(当然还包括一些键盘上的shift, alt, ctrl的组合,对backspace, enter键的处理),也就是键盘驱动
键盘上每一次摁键产生一个make code 和一个 break code,即产生2次中断。
对于组合键,比如shift+a------>就是shift的make code先被从寄存器中取出,并用全局变量记录shift的状态,然后紧接着取过来是a的扫描码的make code,说明a与shift同时摁下,产生一个大A(小a和A的组合码,操作系统中自己定义自己的组合码是什么样子的,具体可参看kerboard.h头文件),送给in_process();来处理。

具体的工作根据键盘上的摁键不同的组合还有很多分支,不过大体就是这个思路。键盘驱动的工作也就完成了。

显示器:

显示器分为很多的模式,当前教程是纯文本模式,会比较简单。
为了显示多个tty,主要工作是将gs的0xffff 显示区域进行分区,然后不同的区域有不同的:

  • original_addr---------这块区域的初始地址
  • current_start_addr-----这块区域当前显示的开始地址
  • v_mem_limit------------这块区域的大小
  • cursor--------------------当前光标位置

这样在切换tty的时候,只需要将对应的tty数据结构中的数据复制到显示器控制器寄存器中,就完成了切换
实现cursor位置的改变,滚屏等都是需要操作寄存器,让其指向显存的不同地址,从而实现操作

posted @ 2011-09-12 09:01  Jack204  阅读(432)  评论(0编辑  收藏  举报