4

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

Exception number 10h corresponds to a "Floating Point Error" but software interrupt 10h also corresponds to "Video support" BIOS interrupts (both in real mode).

What am I missing?

4

4 回答 4

7

你没有错过任何东西。

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 中断使用另一个向量,则这两个向量都应指向协处理器错误异常处理程序。

于 2009-10-28T02:05:44.630 回答
3

好的,在 Watcom 的网站上看看这里。这是我认为的重要部分,尽管关于 8087 的旧笔记也很有趣。

由于绝大多数 PC 用户仍在运行 PC DOS 并需要 IBM PC 兼容性的市场现实,IBM AT 处理数学错误的方式并不简单。因为 IBM 在设计 PC 时忽略了 Intel 的建议,所以 286 的数学故障或中断 16 与 BIOS 视频服务中断 10h(十进制的 16)发生冲突。最重要的是,现有软件预计数学异常将通过 INT 2 到达。

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

当 287 断言其 ERROR 信号时,IBM AT 中的外部电路驱动 286 的 BUSY 输入引脚激活。这可以防止执行进一步的 FPU 指令,并且需要避免在 287 发出错误信号之后和 286 开始处理产生的中断之前的时间窗口中出现问题。

于 2009-10-28T02:06:30.880 回答
2

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

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

另请参阅本文档

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

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

于 2009-10-28T01:45:50.350 回答
0

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

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

于 2010-08-30T00:06:39.967 回答