我是经常看到unsigned int gsi = hvm_isa_irq_to_gsi(isa_irq)这个函数,不知其为何物,搜了一下,看到gsi原来是全局中断号,遂把这篇文章转过来~以作备份,看硬件不多的人伤不起啊~还是看看x86架构
这几个概念经常把人搅晕掉,下面的内容经常要用到它们,还是先说清楚为妙。
IRQ是PIC时代的产物,由于ISA设备通常是连接到固定的PIC管脚,所以说一个设备的IRQ实际是指它连接的PIC管脚号。IRQ暗示着中断优先级,例如IRQ0比IRQ3有着更高的优先级。当前进到APIC时代后,或许是出于习惯,人们仍习惯用IRQ表示一个设备的中断号,但对于16以下的IRQ,它们可能不再与IOAPIC的管脚对应,例如PIT此时接的是2号管脚。
Pin是管脚号,通常它表示IOAPIC的管脚(前面说了,PIC时代我们用IRQ)。Pin的最大值受IOAPIC管脚数限制,目前取值范围是[0,23]。
GSI是ACPI引入的概念,全称是Global System Interrupt。它为系统中每个中断源指定一个唯一的中断号.
有3个IOAPIC:IOAPIC0~2。IOAPIC0有24个管脚,其GSI base为0,每个管脚的GSI=GSI base + pin,故IOAPIC0的GSI范围为[0~23]。IOAPIC1有16个管脚,GSI base为24,GSI范围为[24,39],依次类推。ACPI要求ISA的16个IRQ应该被identify map到GSI的[0,15]。
IRQ和GSI在APIC系统中常常被混用,实际上对15以上的IRQ,它和GSI相等。我们在谈到IRQ时,一定要注意它所处的语境。
Vector是CPU的概念,是中断在IDT表中的索引。每个IRQ(或GSI)都对应一个Vector。在PIC模式下,IRQ对应的vector=start vector + IRQ;在APIC模式下,IRQ/GSI的vector由操作系统分配。