0

Note that a single interrupt source (timer, keyboard, etc.) will not signal a new interrupt to the processor until the processor has indicated that handling of the previous interrupt from that source is ``done'', even if the system-wide interrupt-enable flag is on.

Who tells the PIC the current interrupt is over, and what does "systerm-wide interrupt-enable flag" mean?

4

1 回答 1

1

我在另一个问题的评论中已经涵盖了这一点。:)

好的...更多细节...

如果我们谈论 PIC 及其通常的操作(如在 BIOS 和 DOS 中),则有 16 条 IRQ 线。它们被映射(在 PIC 中)到中断向量8 到 0FhIRQ0 到 IRQ7)和70h 到 77hIRQ8 到 IRQ15)。

通过重新编程 PIC,您可以更改此分配(请参阅 PIC(8259芯片)文档)。更改此分配通常不仅仅是在保护模式下可取的,因为各种重要的异常被硬连线到从0到大约1Fh的中断向量(例如,一般保护异常(AKA #GP)位于向量0Dh,在此默认分配中为IRQ5 ) .

IRQ0是周期性计时器(AKA PIT
IRQ1是键盘
IRQ2用于链接第二个 PIC(每个 PIC 最多处理 8 个 IRQ,因此 16 个 IRQ 有 2 个;IRQ8 到 15 实际上是通过这个 IRQ2 传递的)
IRQ3IRQ4用于 COM1 和 COM2 串行端口
IRQ6用于 FDD
IRQ7用于并行端口(我们以前连接打印机的地方,现在通常是 USB 端口)
IRQ8用于另一个定时器,真正的-时钟 (AKA RTC )
IRQ12通常用于 PS/2 鼠标
IRQ14 和 IRQ15用于 HDD/CDROM

其他 IRQ 不是很固定。

PIC 本身通过 I/O 端口 20h 和 21h (PIC1) 以及 0A0h 和 0A1h (PIC2) 连接到 CPU。

CPU 通过将EOI命令发送到相应的 PIC 来发出 IRQ 处理完成的信号,该 IRQ 来自该 PIC。

因此,对于IRQ0 到 IRQ7,ISR 通常以以下代码结束:

...
mov al, 20h
out 20h, al ; send EOI to PIC1
; restore al using pop or mov
iret

对于IRQ8 到 IRQ15,同样的情况如下所示:

mov al, 20h
out 0a0h, al ; send EOI to PIC2
out 20h, al ; send EOI to PIC1
; restore al using pop or mov
iret

在后一种情况下,每个 PIC 都会获得一个 EOI,因为正如我之前提到的,PIC2 不直接将 IRQ 传递给 CPU,而是通过 PIC1(在 PIC1 的 IRQ2 上;这有效地将 IRQ 的数量限制为 15),所以两者涉及到 PIC。PIC2 是 PIC1 的中断源,就像键盘一样。所以,2个EOI。

此外,一些设备(可能)有自己的EOI. 例如,XT 键盘在它们的一个寄存器中等待一个位脉冲(从 1 到 0)作为键盘中断处理完成的指示。在这种情况下,您发送EOIs给设备和 PIC。

编辑:您所指的文本FLAGS.IF很可能是“系统范围的中断启用标志”。

于 2012-05-07T04:06:10.707 回答