IRQ 和中断向量

IRQ and interrupt vector

在此文档中,http://retired.beyondlogic.org/serial/serial1.htm#30

COM3的IRQ为4,中断向量为0C

但是 int 0C 中断向量被保留用于 堆栈错误 ....

这相当confusing.When COM3 中断,Stack Fault同时发生?

https://en.wikipedia.org/wiki/Interrupt_descriptor_table

beyondlogic.com table 显示 默认 映射,由 BIOS 设置,来自 IRQ(外部中断信号进入可编程中断控制器 (PIC)) 到 CPU 看到的中断或异常编号。所以在这种情况下,来自串行端口的中断线连接到 PIC 输入 3,断言时将导致 CPU 到 运行 interrupt/exception 中断中条目 0xC 指向的处理程序向量 table.

CPU 内部生成的异常也会发生同样的事情。继续您的示例,堆栈错误导致中断向量 table 中条目 0xC 指向的异常处理程序为 运行.

所以在这种情况下,不是串行端口中断导致堆栈错误,而是两个不同的事件可能导致相同的 interrupt/exception 处理程序到 运行。

这种冲突是不可取的。理论上,interrupt/exception 处理程序代码可以检查导致处理程序 运行 的真正原因,但这需要时间,因此我们需要更好的解决方案。

然而,首先值得看看是什么导致了这场冲突。 Intel 始终为内部异常保留小于 0x20 的条目,但在 8086 上仅使用条目 0 到 4,因此当原始 IBM PC 将中断映射到 8 及以上时,这不是问题。

随着 80386 和保护模式的引入,异常数量增加,现在使用条目 5 到 0x14,这意味着当使用默认 IRQ 映射时,中断可能会发生冲突。

因此,大多数 运行 在保护模式下的现代操作系统使用的解决方案是对 PIC 重新编程,以便中断使用中断向量编号 0x20 或更大。请参阅 OSDev.org for more details or for a concrete example see how Linux 执行此操作。