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

Bìn*_*yên 6 x86 operating-system real-mode osdev bootloader

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

Gri*_*wes 9

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停止或重新启动.