"sti" 条指令后计算机重新启动
Computer Reboots After "sti" Instruction
我正在尝试在 x86 操作系统项目中实现中断。但是,在使用 lidt 加载中断描述符 table 后,我发出 sti 命令,此 "sti" 命令重新启动计算机。而且,我处于保护模式。知道会发生什么吗?
有些事情会导致异常。当 CPU 无法启动相应的异常处理程序时,它回退到通用 "double fault" 异常,而当 CPU 无法启动该异常处理程序时, CPU 下降回到 "triple fault" 状态,这主要意味着计算机已重置。
可能有挂起的 IRQ(当中断被“cli
”屏蔽并一直在等待 CPU 准备好接收它们时发生);因此,当您执行“sti
”时,中断控制器会看到 CPU 已准备好接收 IRQ,并立即将一个发送到 CPU; CPU 收到的任何 IRQ 的中断处理程序都可能导致异常(导致双重故障,导致三重 fault/reset)。
找出正在发生的事情的最简单方法是 运行 在模拟器下查看它,该模拟器会告诉您它的日志中发生了什么。另一种方法是为涉及的任何异常编写可用的异常handler/s(很可能是一般保护错误异常处理程序);这样异常处理程序就可以为您提供有关出错的信息(例如 CPU 提供给一般保护错误处理程序的 "error code" 可能指示 CPU 尝试使用哪个 IDT 条目中断请求)。
请注意,在引导过程中,最好的顺序是屏蔽中断 controller/s 中的所有 IRQ,然后让固件处理任何挂起的 IRQ(例如,启用中断后,执行一些“NOP
”指令) .这样,当您稍后“sti
”时,就不会有任何挂起的 IRQ(并且您可以在您真正希望它们被取消屏蔽时取消屏蔽单个 IRQ 源 - 例如,当您安装使用特定 IRQ 的设备驱动程序时)。可悲的是,大多数人(教程、GRUB 等)都做错了,只是“cli
”而没有在中断 controller/s 中屏蔽 IRQ(然后做一些事情,比如重新映射 PIC 芯片等;这让事情变得更平更令人困惑),然后最终不得不应对做错一切的后果。 ;-)
我正在尝试在 x86 操作系统项目中实现中断。但是,在使用 lidt 加载中断描述符 table 后,我发出 sti 命令,此 "sti" 命令重新启动计算机。而且,我处于保护模式。知道会发生什么吗?
有些事情会导致异常。当 CPU 无法启动相应的异常处理程序时,它回退到通用 "double fault" 异常,而当 CPU 无法启动该异常处理程序时, CPU 下降回到 "triple fault" 状态,这主要意味着计算机已重置。
可能有挂起的 IRQ(当中断被“cli
”屏蔽并一直在等待 CPU 准备好接收它们时发生);因此,当您执行“sti
”时,中断控制器会看到 CPU 已准备好接收 IRQ,并立即将一个发送到 CPU; CPU 收到的任何 IRQ 的中断处理程序都可能导致异常(导致双重故障,导致三重 fault/reset)。
找出正在发生的事情的最简单方法是 运行 在模拟器下查看它,该模拟器会告诉您它的日志中发生了什么。另一种方法是为涉及的任何异常编写可用的异常handler/s(很可能是一般保护错误异常处理程序);这样异常处理程序就可以为您提供有关出错的信息(例如 CPU 提供给一般保护错误处理程序的 "error code" 可能指示 CPU 尝试使用哪个 IDT 条目中断请求)。
请注意,在引导过程中,最好的顺序是屏蔽中断 controller/s 中的所有 IRQ,然后让固件处理任何挂起的 IRQ(例如,启用中断后,执行一些“NOP
”指令) .这样,当您稍后“sti
”时,就不会有任何挂起的 IRQ(并且您可以在您真正希望它们被取消屏蔽时取消屏蔽单个 IRQ 源 - 例如,当您安装使用特定 IRQ 的设备驱动程序时)。可悲的是,大多数人(教程、GRUB 等)都做错了,只是“cli
”而没有在中断 controller/s 中屏蔽 IRQ(然后做一些事情,比如重新映射 PIC 芯片等;这让事情变得更平更令人困惑),然后最终不得不应对做错一切的后果。 ;-)