处理来自辅助PIC的x86 IRQ: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维基关于中断的文章:

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示例

德语维基百科文章";软件bremse";("Bremse"的意思是"Brake"(:

mov al, 20h
out 020h, al
out 0a0h, al
sti

我认为这无关紧要
8259A数据表没有透露更多信息,只说明了(两次(:

EOI命令必须发出两次:一次用于主机,一次用于相应的从机。

没有明确说明订单。

首先向从机发送EOI仍然不允许从机发出任何IRQ(直到向主机发送EOI(,因为主机不会为任何从机请求提供服务。当主机收到EOI时,所有IRQ都将被允许。

首先向主机发送EOI将允许新的主机IRQ,但不允许从机IRQ,直到从机也接收到EOI。

因此,首先将EOI发送到从设备不会改变";可中断性";当主控器仍在等待其EOI时,系统的EOI
这样可以更好地控制系统准备接受低优先级中断的时刻。假设IF标志被设置在CCD_ 1之前。


就PICs而言,没有使用特定订单的技术要求。

我认为失去奴隶IRQ的风险没有区别:PIC将在相对IRQ引脚断言后立即设置IRR位,但ISR位仅在接收到来自CPU的ACK后设置(并且IRR位被清除(
IRR-ISR对形成一个小型队列,IRR在中断仍在服务时缓冲请求
当从设备首先收到EOI,而主设备没有收到时,是主设备阻止从设备通过不向CPU发出中断请求来设置ISR和清除IRR。当主设备首先收到EOI,而从设备没有收到时,是从设备本身不会发出中断请求
在任何情况下,IRR都不会被清除,并且只能缓冲一个IRQ请求。

首先向主机发送EOI可能会更早地解锁其(高优先级(IRQ,但我们讨论的是一些指令的时间
再次假设IF标志设置在iret之前。

我看不出有什么理由更喜欢这两个订单中的任何一个。

最新更新