【问题标题】:IRQ Numbering ConflictIRQ 编号冲突
【发布时间】:2009-10-28 01:22:25
【问题描述】:

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

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

我错过了什么?

【问题讨论】:

  • IRQ 冲突?这个硬件有多
  • OP不明白软件中断和硬件中断之间的区别,并要求澄清(我也很好奇一个好的答案......+1)

标签: assembly x86 interrupt bios interrupt-handling


【解决方案1】:

你没有错过任何东西。

8088 处理器(最初的 IBM PC 中使用的那个)只定义了异常 0、1、2、3 和 4。

因此 IBM 将 0x8 到 0xF 用于硬件中断处理程序,将 0x10 及更高版本用于 BIOS 例程。出于某种原因,IBM 忽略了这样一个事实,即英特尔非常明确地保留数字 0x5 到 0x1F 以供将来的处理器异常使用。

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

在旧软件中添加了许多 hack,以便在不破坏太多兼容性的情况下获得一些新处理器功能的使用。虽然我不确定,但我怀疑也许较新的 BIOS 可能会尝试检测 INT10 是由软件中断还是由其 INT10 处理程序中的协处理器触发的。

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

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

【讨论】:

  • 有趣。所以基本上每次 387 引发中断时,它都会为 BIOS 使用相同的中断线,并且操作系统会相应地对其进行多路复用?
  • 就像我说的,我不确定。 asveikau 在“edit 2”下有另一个很好的理论。请注意,这仅与 DOS(以及在实模式下运行的任何其他东西)真正相关 - 对于 Windows 和 Linux 等保护模式系统来说,这不是问题。
【解决方案2】:

好的,看看here, on Watcom's site。这是我认为的重要部分,虽然关于 8087 的旧笔记也很有趣。

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

而不是连接CPU和FPU 错误引脚,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 开始处理 产生的中断。

【讨论】:

  • 但是现在协处理器和处理器是同一个芯片的一部分!我想知道英特尔是采用自己的设计还是屈服于 PC 兼容性。 . .
  • @Artelius,同样来自 Watcom 页面:“到 i486 发布时(1989 年),英特尔已经意识到 PC 兼容市场的重要性。因此 i486 包含专门为提供兼容性而设计的功能与现有的 PC 软件和硬件设计”。 “逆向逻辑”怎么样……
【解决方案3】:

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

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

另见this document

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

编辑 2:想一想,旧的 DOS 程序解决此问题的方式可能是备份 IVT 条目,将自己的异常处理程序放在它的位置,执行一些浮点操作,并在以下情况下恢复旧的 IVT 条目他们用 FPU 完成了。

【讨论】:

  • 真正的 IBM PC/AT 解决这个问题的方法是他们没有将协处理器错误直接与 CPU 联系起来。为了避免这种冲突,英特尔显然向 IBM 建议,最好的方法是将协处理器错误路由到 PIC 中,将其视为外部中断。这就是 PC/AT(及更高版本)上 IRQ13 的目的。为了与将协处理器错误绑定到 NMI (Int 2h) 的 8087 FPU 保持兼容,IBM PC/AT BIOS 将安装一个 IRQ13 处理程序 (int 75h),该处理程序将跳转到 int 2h 处的向量。这意味着 int 10h 可以免费用于 PC/XT 等视频服务
【解决方案4】:

简单的答案是int 10h Floating Point Error 是保护模式异常,而int 10h BIOS Video Services 是实模式中断。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2011-10-28
    • 2013-07-22
    • 1970-01-01
    • 2017-11-07
    • 2019-02-01
    • 1970-01-01
    相关资源
    最近更新 更多