我最近在我的应用程序中添加了一个部件,这意味着它可以与属于次要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
之前。
我看不出有什么理由更喜欢这两个订单中的任何一个。