Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kernel &引用;",;,在保护模式下,CPU将重新启动_Kernel - Fatal编程技术网

Kernel &引用;",;,在保护模式下,CPU将重新启动

Kernel &引用;",;,在保护模式下,CPU将重新启动,kernel,Kernel,英特尔X86平台。 我的程序在保护模式下以2M绝对地址开始运行,一切似乎都正常,但当我用“sti”启用中断时,CPU将重新启动。 为什么?在“enbale中断”之前是否有任何必要的初始化? 我已经设置了idtptr,但它似乎不起作用。您有可以在保护模式下工作的中断处理程序吗?CPU可能有三重故障,这是在处理双重故障时发生异常时发生的。当CPU出现三重故障时,它将复位 这可能是由于中断描述符表设置不正确造成的 OSDev Wiki有一篇很好的文章可以帮助您:您要么没有定义IDT,要么做得不正确。根

英特尔X86平台。 我的程序在保护模式下以2M绝对地址开始运行,一切似乎都正常,但当我用“sti”启用中断时,CPU将重新启动。 为什么?在“enbale中断”之前是否有任何必要的初始化?
我已经设置了idtptr,但它似乎不起作用。

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

CPU可能有三重故障,这是在处理双重故障时发生异常时发生的。当CPU出现三重故障时,它将复位

这可能是由于中断描述符表设置不正确造成的


OSDev Wiki有一篇很好的文章可以帮助您:您要么没有定义IDT,要么做得不正确。根据你的一条评论,“但我使用了“sidt”,基数和极限是正确的”。。。SIDT是“存储中断描述符表”。您需要使用LIDT来加载IDT和IDTR

此外,还应为每个英特尔CPU异常(如GPF、PF等)定义处理程序。请参阅《英特尔程序员手册》3A和3B


在为PIC或IO APIC上的IRQ编写处理程序(驱动程序)之前,最好屏蔽这些IRQ。

您有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只是停止接收向量超出表限制的中断和异常!事实上,每次中断都会导致一般保护异常

嗯,有安装中断处理程序…但我使用了“sidt”,基本和限制是正确的。如何验证中断描述符表的正确性?这是一件棘手的事情,我不是保护模式中断方面的专家。您最好的选择是在以下位置的OSDev论坛上提问: