30天自制操作系统——第14天实验总结

实验日期 实验项目
2020.12.22 第14天 高分辨率及键盘输入

一、实验主要内容

1、 内容1 继续测试性能

(1).内容概要

  • 实验内容:增加定时器数量,观察有无移位对程序性能的影响。

接着上一天的内容,本次实验首先在真机上对消除移位后的程序性能进行了测试,但实际效果并没有预期中的好,数值发生轻微变化的原因可能是因为模拟器。

为了对比程序的性能,笔者在定义了490个定时器,每个定时器的超时设置为50天,这样在测试过程中有无移位从数字上就可以很明显的看出来。

首先在bootpack.c函数中添加set490函数,用来分配定时器,并进行初始化设置,向定时器中加入数据时,将每一个i值加上1024是为了和键盘,鼠标中断产生的数据区分开。
在这里插入图片描述
在HariMain函数中加入set(&fifo,1)追加490个定时器。笔者在真机上运行得到测试结果如下:

  • 追加490个定时器时的值set490(&fifo,1)
    在这里插入图片描述
  • 不追加490个定时器时的值set490(&fifo,0)
    在这里插入图片描述
  • 参考:不加入set490语句
    在这里插入图片描述

追加定时器后,取消移位速度就变快,另外使用哨兵也对精简了程序,加快运行速度。对比不追加定时器的情况 ,没有哨兵时,取消移位反而速度降低了,有哨兵时,取消移位和不取消移位速度基本一致。由此可以知道当存在大量移位操作时,取消移位可以有效地提升性能。

对比是否加入set490语句的程序性能,处理上虽然完全一致,但是结果却相差很大。这是由于C编译器的问题,加入set490语句后,改变了JMP指令的跳转地址,之后的每个指令的地址都会相应地错开几个字节,造成了JMP跳转地址的变化,因此执行时间也稍稍延迟。

2、 内容2 提高分辨率1

(1).内容概要

  • 实验内容:提高画面分辨率。

高分辨率的利用因为显卡的不同而不同。要利用高分辨率,就要考虑到显卡的因素,首先只考虑QEMU模拟器的显卡,等到这个可以用了,再去考虑其他的显卡。

由于显卡种类很多,多家显卡公司经过协商,成立了VESA协会。之后便开始采用通用的设定方法,制作了专用的BIOS。这个追加的BIOS被称作"VESABIOS extension"(VESA-BIOS扩展,简略为VBE)。利用它,就可以使用显卡的高分辨率功能了。

扫描二维码关注公众号,回复: 12682991 查看本文章

VBE的画面模式号码如下

0x101 6404808bit彩色
0x103 8006008bit彩色
0x105 10247688bit彩色
0x107 128010248bit彩色

(2).关键代码分析
在这里插入图片描述
这部分汇编代码是设定画面模式。给AX赋值0x4f02,给BX赋值画面模式号码,这样就可以切换到高分辨率画面模式了。以前画面是320×200的时候,我们用的是“AH-0;AL=画面模式号码;”。现在切换到新画面时就使用“AX =Ox4f02;”。

3、 内容3 提高分辨率2

(1).内容概要

  • 实验内容: 改写程序,使得纸娃娃操作系统的高分辨率能在真机上运行。

(2).关键代码分析

  • 检查VBE是否存在

给ES赋值为0x9000,给DI赋值为0,给AX赋值为0x4f00,再执行“INT 0x10”。如果有VBE的话,AX就会变为0x004f。要是AX没有变为这个值,就只能使用320×200的画面了。
在这里插入图片描述

  • 检查VBE版本是否在2.0以上:从[ES:DI+4]

在这里插入图片描述

  • 检查画面模式0x15能否使用:对AX的值也进行了确认。如果它是0x004f以外的值,就意味着所指定的画面模式不能使用。

在这里插入图片描述
在画面模式信息中,有6个比较重要的信息
在这里插入图片描述
使用汇编代码来确认颜色数,调色板模式,画面模式号码3项。
在这里插入图片描述
确认完成以上信息无误后就可以使用指定的VBE模式了,使用高分辨率画面。下面使用汇编对其进行画面模式的切换。
在这里插入图片描述
做完以上工作,如果可以支持VBE显卡,每次切换分辨率,只需要修改VBEMODE为对应值即可。

4、 内容4 键盘输入

(1).内容概要

  • 实验内容: 实现按下键盘将按键值打印到屏幕上的功能。

(2).关键代码分析

实现思路:使用if语句,对照按键和按键值,将对应的字母使用putfonts8_asc_sht输出即可。为了方便打印更多的字符,设定一个static char数组(static char能编译成DB指令)存储字符,比如说keytable[Ox1e]对应的是“A”。如果i=-0x1e+256的话,keytable[i- 256]就是“A”,所以s[0]也就是“A”了。
在这里插入图片描述
在这里插入图片描述

5、 内容5 追加内容

(1).内容概要

  • 实验内容: 实现键盘输入和删除,以及鼠标光标的闪烁和移动窗口的功能。

(2).关键代码分析
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面这部分代码是用来绘制输入显示框,以及字符输入和删除的功能。
在这里插入图片描述
上面的代码是实现窗口的移动。mx,my分别减去80,8是为了使得移动后鼠标在窗口中央。

二、遇到的问题及解决方法

1、 描述问题1

  • 问题描述

实现密码登陆时,第1次输入错误后,再次输入,即使密码正确,也无法登陆进入。

  • 解决方法

本次实验实现了键盘输入,利用键盘输入可以实现一些操作系统的功能。比如密码登陆。实现时采用数组记录键盘按下的键值,当键值和设置密码一致时,登陆(切换画面)。一开始实现的时候,将密码打印出来,发现并没有将数组清空,在删除处理的时候,用来记录数组位置的count值并没有变化,导致了删除后再次输入的字符只是在原来的基础上增加。同时在密码输入错误时,也增加了清空密码数组的操作。

三、程序设计创新点

1、 描述创新点1,关键代码及结果截图

  • 创新点1

实现密码登陆。输入密码和用户名,密码错误会出现提示信息,输入正确可以登陆进入。

  • 关键代码

设置存储用户名和密码的数组
在这里插入图片描述
根据鼠标是否点击输入框来判断输入位置
在这里插入图片描述
在这里插入图片描述
键盘输入时,使用temp1记录下用户名,使用temp2记录下密码。
在这里插入图片描述
对输入的密码进行判断,正确则进入桌面,错误则输出错误提示信息。
在这里插入图片描述

  • 结果截图

输入用户名和密码
在这里插入图片描述
在这里插入图片描述

四、实验心得体会

本次实验是自制操作系统的第14天,实验继续对第13天的代码性能进行了测试,尝试提高画面分辨率,实现键盘输入和窗口移动等功能。实验的内容比较基础,做完实验内容,尝试修改了自己的画面分辨率,并实现了一个简单的密码登陆。这算是为大设计做准备吧,到第14天,多多少少也将书上的一些东西转化为自己的东西,实现了一些功能,总体上讲还是蛮有成就感的。

猜你喜欢

转载自blog.csdn.net/weixin_44595362/article/details/114271090