首页 > 解决方案 > 计算机在“sti”指令后重新启动

问题描述

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

标签: operating-systeminterrupt

解决方案


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

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

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

请注意,在启动期间,最好的顺序是屏蔽中断控制器中的所有 IRQ,然后让固件处理任何未决的 IRQ(例如,启用中断,执行一些“ NOP”指令)。这样,当您稍后“”时,就不会有任何未决的 IRQ sti(并且您可以在您真正希望它们不屏蔽时取消屏蔽单个 IRQ 源 - 例如,当您安装使用特定 IRQ 的设备驱动程序时)。可悲的是,大多数人(教程、GRUB 等)都做错了,只是“ cli”没有在中断控制器中屏蔽 IRQ(然后做一些事情,比如重新映射 PIC 芯片等;这让事情变得更加混乱),然后结束不得不应对做错事的后果。;-)


推荐阅读