IRQ编号冲突

时间:2009-10-28 01:22:26

标签: assembly x86 interrupt bios interrupt-handling

自: http://software.intel.com/en-us/articles/introduction-to-pc-architecture/

异常编号10h对应“浮点错误”,但软件中断10h也对应“视频支持”BIOS中断(均为实模式)。

我错过了什么?

4 个答案:

答案 0 :(得分:6)

你没有遗漏任何东西。

8088处理器(原始IBM PC中使用的处理器)仅定义了例外0,1,2,3和4.

因此IBM对硬件中断处理程序使用0x8至0xF,对BIOS程序使用0x10及以上。出于某种原因,IBM忽略了英特尔非常清楚保留数字0x5到0x1F以便将来处理器异常的事实。

随着时间的推移,需要更多例外,英特尔继续分配它们。大多数情况下,遗留软件无论如何都不会触发这些异常,而较新的操作系统(以受保护模式运行的系统)可以分配不同的数字,以免与处理器异常冲突。

旧软件中添加了大量黑客,可以在不破坏太多兼容性的情况下使用更新的处理器功能。虽然我不确定,但我怀疑可能更新的BIOS可能试图检测INT10是由软件中断还是由INT10处理程序中的协处理器触发的。

仅供参考,来自386程序员手册:

  
    

协处理器错误导致中断16.任何具有协处理器的80386系统必须使用中断向量16来处理协处理器错误异常。如果8086/8088系统使用另一个向量进行8087中断,则两个向量都应指向协处理器错误异常处理程序。

  

答案 1 :(得分:3)

好的,看看here, on Watcom's site。这是我认为的重要部分,尽管关于8087的旧注释也很有趣。

  由于市场现实的广阔   大多数PC用户仍在运行PC   DOS并要求IBM PC   兼容性,IBM AT的方式   处理数学错误不是   直截了当。因为IBM忽视了   英特尔在设计时的建议   PC,286的数学故障或中断   16与BIOS视频服务冲突   中断10h(十进制16)。在之上   那,现有的软件预期数学   通过INT 2到达的例外情况。

     

而不是连接CPU和FPU   ERROR引脚,IBM AT使用   主板电路路由287   ERROR信号到级联秒   8259A PIC并使用IRQ 13发出信号   数学错误到CPU。默认   BIOS IRQ 13处理程序(即INT 75h   矢量 - 记住IRQ 8,   第二个PIC的第一个IRQ线,   对应中断向量70h)   包含调用INT 2的代码   与现有软件的兼容性。   因此,AT上的软件仍然可以挂钩   NMI向量并保持不变   PC或AT。

     

IBM AT中的外部电路   驱动286的BUSY输入引脚有效   当287断言其ERROR信号时。   这可以防止执行进一步的FPU   说明并要求避免   在时间窗口之后的问题   287表示错误,之前是   时间286开始处理   结果中断。

答案 2 :(得分:2)

浮点故障是由错误条件生成的CPU中断。这与IRQ不同。

PIC(可编程中断控制器)可用于修改哪些IRQ将映射到哪个CPU中断。如果以适当的顺序发送PIC的IO端口(使用OUT指令),则可以映射IRQ,使其不会因浮点异常而与CPU中断冲突。

另见this document

编辑:但现在我再次阅读你的问题......我们不是在谈论IRQ。 BIOS Int 10h是一个完全不同的野兽...这是你的BIOS为视频例程实现的一些代码。如果您正在编写操作系统并想知道是否应该处理浮点故障,那么您应该忘记存在这种特定的BIOS中断。 : - )

编辑2:想想看,可能老DOS程序解决这个问题的方法是备份IVT条目,将自己的异常处理程序放在其位置,做一些浮点运算,并在恢复旧的IVT条目时他们完成了FPU。

答案 3 :(得分:0)

简单的答案是int 10h浮点错误是受保护模式的异常,而int 10h BIOS视频服务是实模式中断。

  

快乐的答案是清除NE寄存器中的CR0位将阻止异常发生并允许它在PM32中用作简单中断(例如32位保护模式BIOS扩展程序)。