为什么在从实模式切换到保护模式之前需要禁用中断?

时间:2013-05-14 05:53:05

标签: operating-system x86 bootloader osdev real-mode

我在许多ose(和一些引导加载程序)中看到,它们都会在从实模式切换到保护模式之前禁用中断(cli)。为什么我们需要这样做?

1 个答案:

答案 0 :(得分:10)

BIOS使用PIT中断(IRQ0)来跟踪时间。一进入保护模式,实模式中断处理就不再有效;处于保护模式的CPU需要保护模式IDT(中断描述符表)。进入保护模式后,IDTR(IDT寄存器)中的IDT限制设置为0(任何中断号使CPU产生异常),因此只要PIT(或其他任何)产生中断,CPU就会产生异常,将产生另一个异常,触发#DF(双重故障),结果是#TF(三重故障)。

此外,在保护模式下发生的IRQ0将触发#DE(除异常)ISR(中断服务程序),因为0到31的中断向量被保留用于保护模式下的异常。

所以,(最可能的,因为除了PIT之外的其他中断也可能发生)发生的事情的顺序是这样的(注意:这假设PIT中断将首先被触发,但是,正如我之前所说,它本质上可以任何中断,每个都会导致#DF和三重故障):

  1. PE位在CR0中设置。
  2. 发生PIT中断,PIC(可编程中断控制器)在其引脚#0上发出信号。
  3. 未重置PIC重映射,因此它会在CPU上触发IRQ0。
  4. IRQ0(= #DE)尝试执行中断处理程序,但IDT的限制为0,因此生成(IIRC)#GP(常规保护错误)。
  5. IDT的限制为0,因此会生成#DF。
  6. IDT的限制为0,因此生成#TF。
  7. CPU停止或重新启动。