建立中断异常处理机制,主要就是对8259A的初始化,建立中断描述符表。因为要对十来个已定义的异常进行处理,再加上16个外部中断的处理,代码量就显得很庞大了。
因为一时间也想不出更好的处理方案,所以就照搬《自己动手写操作系统》里的那一套方法用着先……
具体的初始化流程为:
kernel -> init_prot()
//在 init_prot() 调用init_8259A(),对8259A进行初始化,与以前的代码一样的,只是换成了c形式了。
//调用init_8259A()后 就是重复init_idt_desc()函数对ide表进行初始化话,前十多个是异常处理,后16个是外部中断处理,最后是自定义中断
//值得注意的是为外部中断处理函数建立了一个函数处理表,如此可以在之后灵活的设置修改中断的最终处理函数。
建立中断异常处理机制后(尽管是最简单的),就可以对其进行简单测试。
在kernel.c的main函数里,分别取消以下三个异常测试项的注释符,就可以看到异常信息显示在屏幕上。
//测试异常
//int 3 //测试调试断点异常
//jmp 0x40:0 //测试常规保护错误异常
//ud2 //测试无效操作码异常
对外部中断的测试:
//测试外部中断
//enable_irq(KEYBOARD_IRQ); //开键盘中断
//enable_irq(CLOCK_IRQ); //开时钟中断
注意:因为一下子添加了很多代码,超出了最初在boot.c里设定加载4个扇区大小内核到内存的限制,因此需要将加载的扇区数调大一些……
code:kernel.c(改)
code:klib.h(新)
code:klib.c(新)
code:i8259.h(新)
code:i8259.c(新)