操作系统实验--30天自制操作系统第14天实验日志

一,主要内容

1、内容1:继续测试性能

前一天的程序进行性能检测时,效果并不理想,于是在真机上重新检测看下程序的运行结果。
在这里插入图片描述

发现没有什么不同之后,原因在于在前一个程序的改进的地方是消除了移位处理,要想看到程序上的速度有明显变化,应该是进行了大量的移位操作之后,而一直只使用了三个定时器,所以并没有什么不同。因此增加定时器的个数,也就是增加移位的操作,再次测试程序的性能。a-bootpack.c
在这里插入图片描述

mode代表着是否增加490个定时器。
根据不同的设定,可以看出性能上的变化。

在这里插入图片描述

从上述的测试中可以看出,线性表和哨兵都对程序的性能有所提升。但在(2)和(3)方案中,它们的处理完全一样,但是结果却相差十分巨大,这是因为C编译器的问题,因为跳转目标地址不同,CPU的JMP指令执行的时钟周期数也不一样。在程序中,循环执行count++,虽然for循环会被编译为JMP指令,但是前面还有个set490指令,会使得指令的地址都相应的错开几个字节,导致了JMP指令的地址也会变化,因此执行时间也就出现了延迟,结果变差了3%。这个问题的解决方法就是用nask来编写HariMain,但因为这个太麻烦了,所以作者暂时没有做。

2、内容2:提高分辨率(1)

之前一直都用的是320*200的分辨率,什么东西都显得十分的大,因此就改改分辨率,使得分辨率高些,画面大些。要利用高分辨率,就要考虑到显卡的因素,首先只考虑QEMU模拟器的显卡,等到这个可以用了,再去考虑其他的显卡。在画面切换中,需要使用BIOS,因此改写asmhead.nas的画面模式设定。
在这里插入图片描述

当给AX赋值0x4f02,给BX赋值画面模式号码时,就可以切换到高分辨率画面模式。在使用320x200的分辨率时,采用的是AH=0,AL=画面模式号码的方式,当切换到新画面时,就可以使用AX=0x4f02。前一种方式是不使用VBE的画面模式,后者则是使用VBE的画面模式,即必须使用VBE才能利用的画面模式。
VBE的画面模式号码:
在这里插入图片描述

实际指定时,需要将上述的画面模式号码值加上0x4000,再复制到BX中去,不这样的话就不能顺利运行。
能将画面扩展得十分大的程序:
在这里插入图片描述

通过运行该段程序能将画面变宽。

3、内容3:提高分辨率(2)

之前的高分辨率只能在模拟器中运行,而要在真机上运行的话,首先需要检测真机上的显卡能否使用VBE,如果不能的话,只能退回到原处,继续使用320x200的分辨率。
检测VBE的程序:
在这里插入图片描述

将ES赋值为0x9000,将DI赋值为0,将AX赋值为0x4f00,再执行INT 0x10,将AX与0x004f进行比较;如果有VBE的话,AX将会变成0x004f,如果没有变化,则表示没有VBE,因此便无法切换画面模式。
这段程序运行的原理是,显卡能利用的VBE信息是要写入到内存中以ES:DI开始的512字节中,赋值是为了指定写入地址。
接下来判断VBE的版本是否是2.0以上,如果不是的话,就不能使用高分辨率。
在这里插入图片描述

如果AX比0x0200小的话,那么只能继续使用320x200的画面模式。
在这里插入图片描述

对画面信息进行确认,如果AX是0x004f以外的值,则表示所指定的画面模式不能使用。此次取得的画面模式的信息也会被写入内存中,从ES:DI开始的256字节中。因此ES和DI都保持之前的值不变,则画面模式信息便会覆盖VBE版本的信息。
在这里插入图片描述
在这里插入图片描述

当信息已经完成确认之后,就可以使用指定的VBE画面模式了。
当完成了画面模式的切换后,便可以将分辨率及VRAM的地址等信息赋值到BOOTINFO中。

4、内容4:键盘输入(1)

要实现键盘输入,只需要根据之前按下键时,窗口中所显示的数值,根据该值,对应输出所表示字母或者符号即可。
在这里插入图片描述
在这里插入图片描述

实验结果:
在这里插入图片描述

5、内容5:键盘输入(2)

前一个只能输入一次,显示一个数值,这显然不满足要求。如果按照上一种的写法,要显示出所有的数值需要很长的一段程序,大大增加了程序的长度。因此选择另外一种显示的方法。
首先将要显示的字符都保存在一个字符数组中,然后根据按键按下所对应的值来得到按键对应的字符在数组中的位置,然后用显示函数显示出来即可。
在这里插入图片描述

但是书中在按下@键后会显示出W键,这是因为当@键被按下的时候,HariMain接收到了0x11的数据,这是QEMU的问题。

6、内容6:追记内容(1)

修改程序使得能够输入并显示出多个字符,并且按下BackSpace能够实现删除的功能。
其中cursor_x是用来记住光标显示位置的变量,当输入一个字符后,这个变量就递增8,因为一个字符的长度就是8。Cursor_c变量则表示光标的颜色,每0.5秒变化一次。
Make_textb0x8函数是用来描绘文字输入背景的函数。
在这里插入图片描述

7、内容7:追记内容(2)

实现窗口的移动,根据鼠标的位置,来确定移动后窗口的位置。
在这里插入图片描述

这样的话,可以一直按着左键来移动鼠标,或者让窗口四处移动。但鼠标点击其他位置时,窗口也会出现在想对应的位置,但这样和我们一般认为的窗口移动还是有一定区别的。

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

1,自己使用定时器编写了一个延时函数,但使用后会使光标和我定义的时钟定时器失效

原因:在使用该函数时当时间到达光标和时钟定时器或者其他定时器的时间时,这些定时器就会触发掉,但这里却没有再将其设置的步骤,所以在延时结束后,其他的定时器会因没有重置而失效,解决办法:在延时结束后重置其他定时器
在这里插入图片描述

三、程序设计创新点

实现一个有开机动画且可以使用键盘输入的登录操作系统界面,同时登录界面满足错误提示,以及错误超过一定次数后将系统锁住。
1,这里我们将登录界面看成一个图层这样方便我们解除登录状态,然后绘制登录界面的图形
这里我采用的是两种背景的五环图形:
在这里插入图片描述

而这5个环分别都是5个图层,因为后续我想让这5个环动起来,使用图层的话可以避免计算图形互相覆盖的问题,这里5个圆设置好透明色,除了圆环以为其他地方都设置为透明色
在这里插入图片描述
在这里插入图片描述

然后绘制输入框,这里仿照作者的输入框绘画函数在相应位置,并设定相应的光标位置画出即可
在这里插入图片描述

2,实现键盘输入时字符可以打印在输入框中,这里因为输入的是密码,所以应该显示*字符,然后内部代码逻辑方面要进行对提交代码正确性的判断
这里定义两个字符串,一个为密码,另一个为用户提交的密码,两者进行比较就好,具体判断过程如下:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值