30天自制操作系统day14
一、实验主要内容
1、 内容1:继续测试性能
昨天的实验,对于harib10g以及harib10i我们对比一下性能:
运行的数值差别很小
我们对于harib10h的改进之处在于消除了移位处理。需要使用大量的定时器才会发生移位,而我们使用的定时器只有三个。所以我们使用大量的定时器来测试性能:
我们设置了490个定时器,为了不让定时器超时,我们将超时时间设置为50天。
然后我们在真机上比较一下运行结果:
观察(1),追加490个定时器,取消移位速度变快,使用哨兵也有效果。
观察(2),不追加490个定时器,没哨兵,取消移位速度变慢;有哨兵,速度快一点点。
比较(1)和(2)的harib11c,没有移位,无论定时器多少,性能没有变化。而如果有移位的情况下,性能上差1018。
比较(2)和(3),处理上相同,结果相差345万。原因是C编译器的问题,for语句被翻译成JMP指令,在前面加上了set490(&fifo,0),
导致各个指令错开几个字节,执行时间延迟。
2、 内容2:提高分辨率(1)
我们原来的画面大小是320200,我们现在要扩大画面
由于画面切换中我们要使用BIOS,我们需要改写asmhead.nas的画面模式设定部分
切换到不使用VBE的画面模式时用“AH=0,AL=画面模式号码”,切换到使用VBE的画面模式用“AX=0x4f02,BX=画面模式号码”,使用VBE才能使用的新画面模式。
make run 640480
我们也可以将画面扩展的更大,可以修改如下:
3、 内容3:提高分辨率(2)
我们让其能在真机上运行。
我们将ES赋值为0x9000,给DI赋值为0x4f00,再执行“INT 0x10”,如果有VBE,AX会变成0x004f,如果没有,只能使用320*200画面。
如果VBE的版本不是2.0以上,也不能使用高分辨率。我们来调查一下VBE的版本,
下一步通过VBE来查看画面模式0x105能不能使用,我们这样设定:
这里对AX进行确认是否是0x004f,我们的画面模式信息写入内存中从ES:DI开始的256字节中,画面信息会覆盖VBE版本信息导致其消失。
画面信息中,有6个重要信息:
当这些全部完成之后,我们就可以使用指定的VBE画面模式了。
当完成了画面模式的切换后,便可以将分辨率及VRAM的地址等信息赋值到BOOTINFO中。
4、 内容4:键盘输入(1)
我们对harib11e再次运行,我们按下A键,按下的时候显示1E,键弹起的时候显示9E
按下键显示的数值再加上0x80就得到键弹起时的数值
按下键时的数值表
保留?的地方还没有被定义,用于将来的键盘增加使用。
我们希望的是按下A的时候,显示的是A
当我们按下的键是A键时,我们显示A键
我们还把窗口名字由count改为window
make run
5、 内容5:键盘输入(2)
刚才的程序只是实现了按下A键时显示A,并没有实现其他的按键
我们希望也可以输入B,C……,我们可以按照刚才的方式,每个按键都需要一个if语句,
这样程序会变得非常长
我们使用另一种方法:
我们将keytable[]设定为static char,程序被编译为汇编时,static char能编译成DB指令
这个字符串的顺序是根据按下键的值来排序的,例如keytable[0x1e]对应的是A,如果i=0x1e+256,keytable[i-256]就是A,所以s[0]就是A。同理,其他按键也是可以显示的。
make run
当我们按下Z
书中说按下@键,却显示出W,这是QEMU的问题,真机上就没问题。不过我自己不能按下@键,只会显示2。
6、 追记内容(1)
我们在窗口添加一些话,改变鼠标和字符的显示位置以及颜色。当我们按下退格键,我哦们可以改写已输入的字符。
cursor_x用来记住光标显示位置,输入一个字符,这个变量递增8,cursor_c表示现在光标的颜色,每0.5秒变化一次。
make_textb0x8用来描述文字输入背景。
7、 内容7:追记内容(2)
我们来移动窗口
仅仅使用了两行代码,实现了窗口的移动,可以用鼠标来对窗口拖动,而且还对范围进行了界定,还能实现鼠标点击哪里,窗口图层就一下子移动到哪里,不愧是大佬的代码,厉害!
二、遇到的问题及解决方法
1、 描述问题1
为什么输入的时候一个字母会一直输入
解决方法:要将大写字母开启才行,这样就可以进行正常的输入
三、程序设计创新点
1、描述创新点1
密码页面的设计,输入以及比对是否正确
2、 描述创新点2
绘图程序,当点击字号大小时,弹出窗口,输入数字,可得到相应的字号
https://download.csdn.net/download/weixin_43979304/15320819?spm=1001.2014.3001.5503