30天自制操作系统(22)
DAY22_用C语言编写应用程序
1.保护操作系统(5)
问题:在定时器上做手脚,光标闪烁变得异常缓慢,任务切换的速度也会变得缓慢。[INSTRSET "i486p"]
[BITS 32]
MOV AL,0x34
OUT 0x43,AL
MOV AL,0xff
OUT 0x40,AL
MOV AL,0xff
OUT 0x40,AL
; 上述代码的功能与下面代码相当
; io_out8(PIT_CTRL, 0x34);
; io_out8(PIT_CNT0, 0xff);
; io_out8(PIT_CNT0, 0xff);
MOV EDX,4
INT 0x40
- 执行CLI然后再HLT。由于不再产生定时器中断,任务切换也会停止,键盘和鼠标中断也停止响应。
2.帮助发现bug
CPU的异常处理功能,除了可以保护操作系统免遭应用程序的破坏,还可以帮助我们在编写应用程序时及早发现bug。
对栈异常的处理:
要想让它发现bug,最好能知道引发异常的指令的地址。
int *inthandler0c(int *esp) |
3.强制结束应用程序
- 如何实现?
将某一个键设定为强制结束键,按一下就可以结束程序。
把强制结束处理写在其他的任务中,bootpack.c
4.用C语言显示字符串(1)
已经做好了用来显示字符串的API,却没做可供C语言调用该API的函数。
5.用C语言显示字符串(2)
连接了.obj文件的bim2hrb认为“hello, world”这个字符串就应该存放在0x400这个地址中。
由bim2hrb生成的.hrb文件其实是由两个部分构成的。
- 代码部分
- 数据部分
修改console.c:
- 文件中找不到“Hari”标志则报错。
- 数据段的大小根据.hrb文件中指定的值进行分配。
- 将.hrb文件中的数据部分先复制到数据段后再启动程序。
6.显示窗口
编写一个用来显示窗口的APIEDX = 5
EBX = 窗口缓冲区
ESI = 窗口在x轴方向上的大小(即窗口宽度)
EDI = 窗口在y轴方向上的大小(即窗口高度)
EAX = 透明色
ECX = 窗口名称
7.在窗口中描绘字符和方
显示字符的API:EDX = 6
EBX = 窗口句柄
ESI = 显示位置的x坐标
EDI = 显示位置的y坐标
EAX = 色号
ECX = 字符串长度
EBP = 字符串
描绘方块的API:EDX = 7
EBX = 窗口句柄
EAX = x0
ECX = y0
ESI = x1
EDI = y1
EBP = 色号