处理来自辅助PIC的x86IRQ:EOI订单重要吗?
我最近在我的应用程序中添加了一个部分,旨在允许它使用属于辅助 PIC 的 IRQ 进行操作。特别是,中断处理程序需要向两个 PIC 发出中断结束条件信号,而不是仅向主 PIC 发出信号。这是我的代码:
push cs
pop ds
mov al, 20h ; acknowledge interrupt
cmp byte [serial_use_irqmask + 1], 0
je @F
out 0A0h, al ; to secondary PIC
@@:
out 20h, al ; to primary PIC
现在,在添加这部分时,我考虑是先向次要 PIC 发送 EOI 信号,还是向主要 PIC 发送信号。以任何方式搜索都没有产生任何陈述。但是,我发现一些示例似乎选择了我最终实施的顺序;即首先是次要 PIC,然后是主要 PIC。
我的问题是,这有关系吗?是否有实际的理由更喜欢这两种顺序?
次要PIC的例子
bootlib中断处理程序:
movb $0x20, %al # end of interrupt command
outb %al, $0xA0 # PIC2 command port
outb %al, $0x20 # PIC1 command port
osdev.org wiki关于中断的文章:
mov al, 20h
out A0h, al
out 20h, al
Pure64中断处理程序:
mov al, 0x20 ; Acknowledge the IRQ
out 0xA0, al
out 0x20, al
Dos64 存根中断处理程序:
Irq0007_1:
mov al,20h
out 20h,al
pop rax
swint:
iretq
;--- IRQs 8-F
Irq080F:
push rax
mov al,20h
out 0A0h,al
jmp Irq0007_1
首先是主要 PIC 的示例
德语维基百科文章“Softwarebremse”中的示例(“Bremse”的意思是“刹车”):
mov al, 20h
out 020h, al
out 0a0h, al
sti
回答
我不认为这很重要。
8259A 数据表没有再说明,只是说明(两次):
EOI 命令必须发出两次:一次用于主机,一次用于相应的从机。
没有明确说明顺序。
首先将 EOI 发送给从站仍然不允许来自从站的任何 IRQ(直到 EOI 到主站),因为主站不会为任何从站请求提供服务。当主机收到 EOI 时,所有 IRQ 将被允许。
首先将 EOI 发送给主机将允许新的主机 IRQ 但不允许从机 IRQ,直到从机也收到 EOI。
因此,当主站仍在等待其 EOI 时,首先将 EOI 发送给从站不会改变系统的“可中断性”。
这允许更好地控制系统准备好接受较低优先级中断的时刻。假设之前设置了 IF 标志iret。
就PIC而言,没有使用特定顺序的技术要求。
我认为丢失从属 IRQ 的风险没有区别:PIC 将在相关 IRQ 引脚置位后立即设置 IRR 位,但仅在收到来自 CPU(和 IRR)的 ACK 后才设置 ISR 位位被清除)。
IRR-ISR 对形成一个迷你队列,当中断仍在处理时,IRR 会缓冲请求。
当从设备首先收到 EOI 而主设备没有收到时,是主设备通过不向 CPU 发出中断请求来阻止从设备设置 ISR 和清除 IRR。当主机首先收到 EOI 而从机没有收到时,是从机本身不会发出中断请求。
在任何情况下,IRR 都不会被清除,并且只能缓冲一个 IRQ 请求。
首先将 EOI 发送给 master 可能会更早解锁其(高优先级)IRQ,但我们正在讨论一些指令的时间安排。
再次假设 IF 标志在 之前设置iret。
我看不出有任何理由更喜欢这两种排序中的任何一种。