Operating system “之后计算机重新启动”;sti“;指示

Operating system “之后计算机重新启动”;sti“;指示,operating-system,interrupt,Operating System,Interrupt,我试图在x86操作系统项目中实现中断。然而,在用lidt加载中断描述符表之后,我发出sti命令,这个“sti”命令重新启动计算机。而且,我处于保护模式。知道会发生什么吗?有些事情会导致异常。当CPU无法启动相应的异常处理程序时,它会退回到一般的“双故障”异常,当CPU无法启动该异常处理程序时,CPU会退回到“三故障”状态,这主要意味着计算机被重置 很可能存在挂起的IRQ(在中断被“cli”屏蔽并一直等待CPU准备好接收中断时发生);因此,当您执行“sti”时,中断控制器会看到CPU现在准备好接收

我试图在x86操作系统项目中实现中断。然而,在用lidt加载中断描述符表之后,我发出sti命令,这个“sti”命令重新启动计算机。而且,我处于保护模式。知道会发生什么吗?

有些事情会导致异常。当CPU无法启动相应的异常处理程序时,它会退回到一般的“双故障”异常,当CPU无法启动该异常处理程序时,CPU会退回到“三故障”状态,这主要意味着计算机被重置

很可能存在挂起的IRQ(在中断被“
cli
”屏蔽并一直等待CPU准备好接收中断时发生);因此,当您执行“
sti
”时,中断控制器会看到CPU现在准备好接收IRQ,并立即向CPU发送一个IRQ;CPU接收到的任何IRQ的中断处理程序都可能导致异常(导致双重故障,导致三重故障/复位)

找出发生了什么的最简单方法是在一个模拟器下运行它,该模拟器告诉您在它的日志中发生了什么。另一种方法是为涉及的任何异常编写可用的异常处理程序(很可能是通用保护故障异常处理程序);因此,异常处理程序可以向您提供有关出错原因的信息(例如,CPU向常规保护故障处理程序提供的“错误代码”可能指示CPU尝试将哪个IDT条目用于IRQ)


请注意,在引导期间,最佳顺序是屏蔽中断控制器中的所有IRQ,然后让固件处理任何挂起的IRQ(例如,启用中断时,执行一些“
NOP
”指令)。这样,当您稍后“
sti
”时,就不会有任何挂起的IRQ(并且您可以在实际需要解除单个IRQ源的掩码时解除其掩码-例如,当您安装使用特定IRQ的设备驱动程序时)。可悲的是,大多数人(教程、GRUB等)都做错事,只是在中断控制器中不屏蔽IRQ的情况下“
cli
”(然后再做一些事情,比如重新映射PIC芯片等,这会让事情变得更加混乱),最后不得不处理所有错事的后果。;-)

谢谢你的回答。根据您的解释,我首先使用临时处理程序初始化了所有IDT条目,然后设置了“sti”指令。它起了神奇的作用。我认为,这消除了刚开始时发生的异常,而不是计算机在第一个异常发生时给出另一个异常,只执行“nop”指令,这是我的临时处理程序。