处理来自辅助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

我看不出有任何理由更喜欢这两种排序中的任何一种。


以上是处理来自辅助PIC的x86IRQ:EOI订单重要吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>