繁体   English   中英

BIOS 如何区分中断(08h-12h)和 INT 指令,以及 CPU 内部的实际异常?

[英]How does the BIOS distinguish Interrupt(08h-12h) from INT instructions, vs. actual exceptions inside the CPU?

这纯粹是学术性的,过时的,出于好奇。 让我们回到 1990 年代,在 Windows 出现之前,实模式 DOS 程序很常见。

BIOS 为自己的中断处理程序重新映射了 INT 08H+,例如,int 10H 用于 VGA 模式开关,int 13H 用于硬盘驱动程序。 软件中断编号表

但是,正如我们在英特尔® 64 和 IA-32 架构软件开发人员手册中看到的那样,我们可以知道也有许多实地址异常会导致中断。 例如,#DE 除异常引发中断向量0h ,或 x87 FPU 引发10h ( https://wiki.osdev.org/IVT )

如果程序员有意或无意bound让 CPU 通过运行诸如可以触发BOUND Range Exceeded异常的指令来自行引发这些异常,那么 BIOS 或其他任何东西如何将其与INT 5软件中断区分开来,使其成为PRINT SCREEN打电话,例如。 这是相同的 IVT 条目,因此对于任何一种情况都将调用相同的中断处理程序。

更重要的是,如果你想使用键盘,IRQ 就无法触发这些中断。 OSdev IRQ 分配表

由于BIOS重新映射了许多Intel的默认中断,因此事情变得不合理。


这是交叉发布到retrocomputing.SE并且在那里也有答案。

BIOS 如何区分中断(08h-12h)和 INT 指令,以及 CPU 内部的实际异常?

大多数情况下不会。 它假设中断 0x08 到 0x0F 是 IRQ(来自 PIC 芯片/设备); 当中断是软件中断时没有任何用处(并且在某些情况下会向 PIC 芯片发送 EOI,这可能会导致问题); 并在异常时崩溃和/或锁定(通过“异常->返回错误代码->异常->返回错误代码...”循环)。

理论上,可以询问相应的 PIC 芯片是否有 IRQ 在服务中,以区分真正的 IRQ 和其他原因(软件中断、异常和“虚假 IRQ 7 或 15”); 并且还可以检查“返回 CS:IP”处的字节,以区分软件中断和其他原因(异常、虚假 IRQ)。 没有“异常 0x0F”(保留); 所以这组“理论上可能”涵盖了所有的情况。

没有人这样做。

操作系统通过重新配置 PIC 芯片和/或 IO APIC 来解决问题,以确保异常和 IRQ 之间没有冲突,并使用特权级别来确保异常或 IRQ 使用的中断的软件中断会导致一般保护错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM