注:本文档为《从0学x86操作系统》课程配套的学习文档,提供相应的辅助学习资料和答疑勘误。 有关该课程的信息,请点击这里访问:https://study.163.com/provider/1017884735/index.htm 在阅读本文档时,如有疑问和建议,欢迎在下方留言或者直接联系我。
除0异常跑飞重启的原因
原因:进入32位保护模式后,向量表需要重新配置,不能再使用BIOS自己提供的。
IDT表
进入保护模式后,需要使用新的向量表,即IDT表。其配置类似于GDT表,由一个寄存器指向:IDTR寄存器。
参考手册第202页
IDT表项有多种类型,本课程只使用其中的interrupt gate,其它两种如有兴趣可以自行查看。其中interrupt gate中segment selector指定了代码段的选择子,offset指定了偏移。即二者结合,指定了各表项对应的异常/中断的处理程序的首地址。
参考手册第203页
地址生成如下:
- 根据向量号取IDT中的对应表项,
- 从IDT表项取选择子
- 用选择子从GDT表中查找段的首地址,
- 将段首地址+IDT表项中的偏移量,生成处理程序的首地址
- 跳转至首地址运行。
参考资料
- 课程附带的intel编程文档卷3:Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3 (3A, 3B, 3C & 3D): System Programming Guide