发布于 

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) 
{
struct CONSOLE *cons = (struct CONSOLE *) *((int *) 0x0fec);
struct TASK *task = task_now();
char s[30]; /*这里!*/
cons_putstr0(cons, "\nINT 0C :\n Stack Exception.\n");
sprintf(s, "EIP = %08X\n", esp[11]); /*这里!*/
cons_putstr0(cons, s); /*这里!*/
return &(task->tss.esp0); /*强制结束程序*/
}
int *inthandler0d(int *esp)
{
struct CONSOLE *cons = (struct CONSOLE *) *((int *) 0x0fec);
struct TASK *task = task_now();
char s[30]; /*这里!*/
cons_putstr0(cons, "\nINT 0D :\n General Protected Exception.\n");
sprintf(s, "EIP = %08X\n", esp[11]); /*这里!*/
cons_putstr0(cons, s); /*这里!*/
return &(task->tss.esp0); /*强制结束程序*/
}

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.显示窗口

编写一个用来显示窗口的API

EDX = 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 = 色号