Orange'S:一个操作系统的实现

输入/输出系统

Posted by BINBIN Blog on November 8, 2019

输入/输出系统

主要验证代码是否ok,后续在做笔记,工作越来越忙!

a章节,keyboard键盘中断处理程序,按下任意键盘,只显示了* 后面再无反应,详细看书上解释所说!

b章节 使用in out指令操作,从8042读取缓冲扫描码!

如图所示,按下a

c章节

用数组表示扫描码,8042的输入缓冲区大小只有一个字节,所以当一个扫描码有不止一个字符时,实际上会产生不止一个中断,也就是说,如果我们按下Shift+A,产生的0x2A0x1E0x9E0xAA是4次中断接收来的。

因为第一次中断时收到的0x2A无法让我们知道用户最终会完成什么! 所以0x2A要保存起来,建立缓冲区,新建立一个任务专门用来解析它们并做相应处理!

任务是tty,这个任务以后不仅仅处理键盘操作也处理比如屏幕输出等内容!

d章节 让字符显示出来

e章节

显示大写字母和特殊符号,,但是你会发现有奇怪的特殊符号,后面章节会处理不在打印奇怪的特殊符号了!

f章节

不在打印特殊的符号

TTY 就是终端

书上先简单解释了终端!

之前打印字符用到BIOS 中断来实现的,到了保护模式,就不能用BIOS中断了!

针对显示,我们目前先用80 X 25 文本模式。这个模式下,显存是32kb字节,占用的范围是0xB8000 ~ 0xBFFFF。 每2个字节代表一个字符,其中低字符表示字符的ASCII 码,高字节表示字符的属性! 一个屏幕总共可以显示25行,每行80个字符!

注意显存的空间

80 X 25 X 2 = 4000字节

显存有32kb,每个屏幕才占用4k,所以显存足以存放8个屏幕的数据!

目前书上先设置3个tty,分别用10kb的空间还有剩余,还能实现滚屏功能!

那么如何让系统显示指定位置的内容呢?

很简单,通过端口操作设置相应的寄存器就可以了!

书上设定的系统使用VGA以上的视频子系统

后面操作的是VGA系统 的寄存器! 详细请看书上所说!

h章节 就是修改光标的位置,让它跟随我们敲入的每一个字符,之前代码一直都没有动光标! 之所以disp_pos 被2 除,是因为屏幕上每个字符对应2字节!

按下shift + ↑ ,就是卷动屏幕至80 X 15 处,也就是向上卷动15行。

tty任务

轮询功能就是

  1. 处理输入— 查看是不是当前TTY,如果是则从键盘缓冲区读取数据。
  2. 处理输出— 如果有要显示的内容则显示它。

每个TTY 都应该有自己的读和写的动作。

让输入和输出分离

每个TTY 回显字符时操作的CONSOLE 是不同的!

i章节

j章节

显示开始地址被重新设置, 按下alt + F3 如图

h章节

当试图向下滚动的时候,将不再响应,最上端也是这样。下面来看响应shift + ↑ 和 shift + ↓ 如下图

l章节

完善键盘处理! 键入Welcom Enter and BlackSpace!- 回车 - 回车 - 键入 ‘a’ - 回车 - 回车 -键入 ‘b’ - 回车 - 回车 - 键盘’c’ - 回车 -回车 -回车 - 键入’123456‘ - 退格 - 退格 - 键入’789’。

m章节

增加大写功能,且小键盘使用!

调试发现大写没有用!

待定!

现在我们有四个进程,分别是TTY 、 A、B、C

其中 A B C 是可有有无的,不是操作系统的一部分,tty不同,没有它键盘都无法使用!

TTY 称呼为‘任务’, A B C 为用户进程!

让用户进程运行在ring3 任务继续留在ring1

o章节

现在进程用了printf函数来显示了,不用disp_str函数了!