“STI”,在保护模式下,CPU将重启

时间:2010-03-23 07:04:24

标签: kernel

INTEL X86平台。   我的程序在保护模式下以2M绝对地址运行,一切似乎都没问题,但是当我用“sti”启用中断时,CPU将重新启动。   为什么? “enbale interrupt”之前有没有必要的初始化?   我已经设置了idtptr,但似乎没有用。

4 个答案:

答案 0 :(得分:1)

你要么没有定义IDT,要么你做错了。根据你的一条评论'但我使用了“sidt”,基数和限制是正确的...... ... SIDT是“存储中断描述符表”。您需要使用LIDT加载IDT和IDTR。

此外,您应该为每个Intel CPU异常(例如GPF,PF等)定义处理程序。请参阅英特尔程序员手册3A& 3B。

在为这些处理器(驱动程序)编写处理程序(驱动程序)之前,屏蔽PIC或IO APIC上的任何IRQ也是一个好主意。

答案 1 :(得分:0)

您是否有可在保护模式下工作的中断处理程序?

答案 2 :(得分:0)

CPU可能是三重故障,在处理双故障时发生异常时会发生这种情况。当CPU三重故障时,它会重置。

这可能是由于设置错误的中断描述符表引起的。

OSDev Wiki有一篇很好的文章可以帮到你:http://wiki.osdev.org/Interrupt_Descriptor_Table

答案 3 :(得分:0)

你有99%的概率经历过这种被称为三重过错的现象。根据IA-32架构,在异常触发的情况下CPU自动尝试执行适当的异常处理程序。如果此尝试导致另一个异常(这种情况称为双重故障),则CPU尝试执行双故障异常处理程序(IDT中为0x08)。如果在此尝试期间触发另一个异常,则CPU进入三重故障状态。 CPU通过关机周期回复它,这通常会导致主板硬件启动CPU重置,从而导致整个计算机重新启动。

在您的情况下,您有下一个行动序列:

interrupt from some device -> exception -> exception    -> reset
normal execution           -> fault     -> double fault -> triple fault

确保已正确初始化IDT并安装了所有256个描述符,每个描述符都指向正确的处理程序。注意!您可以使用任意大小的表加载IDT。但这并不意味着CPU只是停止接收超出表限制的向量的中断和异常!实际上每个中断都会导致一般保护异常!