6

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

4

1 回答 1

8

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 (General Protection fault)。
  5. IDT 的限制为 0,因此生成了#DF。
  6. IDT 的限制为 0,因此生成了#TF。
  7. CPU 停止或重新启动。
于 2013-05-15T20:14:32.990 回答