全文来自Intel手册(见参考1):Intel? 82093AA I/O Advanced Programmable Interrupt Controller (I/O APIC) Datasheet
注意:下文中已经指出手册中的对应页面和章节,请对照手册原文看,任何个人理解错误,请包涵。
一,以下内容来自(P9):3.2. IOAPIC Registers
1,IOAPIC标识寄存器
偏移:00h
默认值:00h
属性:可读/写
字段:27:24为IOAPIC标识

2,IOAPIC版本寄存器
偏移:01h
默认值:00170011h
属性:只读
字段:23:16为最大转换条目数(Maximum Redirection Entry),该值等于输入引脚数目减1。取值范围为0到239。82093AA的该值为17h。
7:0为APIC版本号。

3,IO转换表寄存器
偏移:
10-11h (IOREDTBL0) 28-29h (IOREDTBL12)
12-13h (IOREDTBL1) 2A-2Bh (IOREDTBL13)
14-15h (IOREDTBL2) 2C-2Dh (IOREDTBL14)
16-17h (IOREDTBL3) 2E-2Fh (IOREDTBL15)
18-19h (IOREDTBL4) 30-31h (IOREDTBL16)
1A-1Bh (IOREDTBL5) 32-33Fh (IOREDTBL17)
1C-1Dh (IOREDTBL6) 34-35h (IOREDTBL18)
1E-1Fh (IOREDTBL7) 36-37h (IOREDTBL19)
20-21h (IOREDTBL8) 38-39h (IOREDTBL20)
22-23h (IOREDTBL9) 3A-3Bh (IOREDTBL21)
24-25h (IOREDTBL10) 3C-3Dh (IOREDTBL22)
26-27h (IOREDTBL11) 3E-3Fh (IOREDTBL23)
默认值:xxx1 xxxx xxxx xxxxh
属性:可读/写

这是一系列我特别关注的寄存器,有24个,每一个寄存器专注于一个中断输入信号的相关设置。与8259A的IRQ引脚不同的是,IO APIC的中断优先级与中断输入信号物理位置无关,而是由软件检查中断向量来确定。通过这些的寄存器,对于每一个中断信号,操作系统可以单独指定它的信号极性、边缘触发还是水平触发以及目标和投递模式等。

如果一个中断的时间超过一个CPU时钟周期(CLK cycle),那么IO APIC将使用边缘触发方式。中断输入是异步进行的,因此必须保证设置和控制的总时间至少在一个CPU时钟输入的上升边缘内。一旦检测到某个中断信号,IO APIC内的递交状态位就将被置位。直到IO APIC通过APIC总线把该信号投递到目标字段所指定的对应目标并被接受为止,那个中断输入引脚都不会被再次检测识别到新信号。只有在对应的目标APIC将IRR(Interrupt Request Register)位从0修改为1时,也就是对应中断已经被目标APIC处理掉而不再处于pending未决状态时,那个中断输入引脚上的新信号才会被重新检测到。

字段:
63:56:Destination Field—R/W:指定接收该中断的目标lapic。
Destination Mode IOREDTBLx[11] Logical Destination Address
0, Physical Mode IOREDTBLx[59:56] = APIC ID
1, Logical Mode IOREDTBLx[63:56] = Set of processors

如果是Physical Mode(见字段11),那么该字段包含的是APIC ID号;因为“在P6和奔腾处理器上,lapic的ID号只占4bit”,所以这里也只占59:56的4bit。但是“在奔四和至强处理器上,xAPIC将ID号扩展到8bit”,因此对应到这里应该也是8bit。不过这个文档上暂时没有说明。
如果是Logical Mode,那么该字段包含的是处理器组,具体如何匹配目标还涉及到每个lapic的DFR(Destination Format Register)和LDR(Logical Destination Register)寄存器。

55:17:保留。

16:Interrupt Mask—R/W:中断掩码。
如果该位设置为1,那么对应的中断信号被屏蔽(masked)。被屏蔽中断引脚上发生的边缘触发(Edge-sensitive)中断信号将被忽略,即不会被投递和保持pending未决。被屏蔽水平触发(level-sensitive)引脚上发生的水平断言(Level-asserts)和取消(negates)操作也都被忽略,而不会产生负面作用。在中断被lapic接受后,修改掩码位从非屏蔽状态到屏蔽状态对那个中断(即已被lapic接受的中断)没有任何影响,这与在中断递交到处理器之前,设备撤回了中断的情况类似。在中断信息被lapic单元接收但还未分配到处理器的这段时间内,如果设置了该掩码位,那么需要由软件来负责处理这种情况。
如果该位设置为0,那么对应的中断信号没有被屏蔽,边缘或水平中断都将被投递到目标lapic。

15:Trigger Mode—R/W:触发模式。
1为水平触发;0为边缘触发。

14:Remote IRR—RO:Remote Interrupt Request Register。
该bit位仅供水平触发中断使用。对于边缘触发中断而言,该bit位无意义。
当lapic接受io apic投递的水平触发中断时,该bit位被设置为1。当一个来之lapic的带有匹配中断向量的EOI消息被io apic接收时,该bit位被设置为0。

13:Interrupt Input Pin Polarity (INTPOL)—R/W:中断输入引脚极性。
0表示高活跃(High active),1表示低活跃(Low active)。

12:Delivery Status (DELIVS)—RO:投递状态。
标识中断的当前投递状态。0表示当前没有活动的中断投递,1表示当前正在进行中断投递。

11:Destination Mode (DESTMOD)—R/W:目标模式。
该字段用于解释字段Destination(63:56),如果该字段为0,那么字段Destination里存储的是APIC ID号;如果该字段为1,那么在每个lapic的寄存器DFR(Destination Format Register)和LDR(Logical Destination Register)的控制之下对字段Destination进行匹配来识别目标。

10:8:Delivery Mode (DELMOD)—R/W:投递模式。
由该字段来指定目标lapic如何接收处理这个信号。值得注意的是,有些投递模式必须与特定的触发模式联合使用。
000:Fixed:通过INTR信号线将信号投递到所有目标处理器。边缘触发和水平触发都可以使用。
001:Lowest Priority:通过INTR信号线将信号投递到目标lapic中当前执行在最低优先权限的处理器。边缘触发和水平触发都可以使用。
010:SMI:System Management Interrupt,系统管理中断。只能使用边缘触发模式。中断向量信息被忽略,但为了向前兼容,必须设置为全0。
011:保留。
100:NMI:通过NMI信号线将信号投递到所有目标处理器。中断向量信息被忽略。即便编程设置为水平触发中断,NMI也会被当做边缘触发中断对待。虽然如此,但为了更正确的操作,最好将其设置为边缘触发方式。
101:INIT:通过INIT信号线将信号投递到所有目标处理器。所有接收到该信号的lapic需保证它们处于INIT状态。即便编程设置为水平触发中断,INIT也始终会被当做边缘触发中断对待。虽然如此,但为了更正确的操作,最好将其设置为边缘触发方式。
110:保留。
111:ExtINT:通过INTR信号线将信号投递到所有目标处理器,就如同该信号来之一个外部连接的8259A型中断控制器。只能使用边缘触发。

7:0:Interrupt Vector (INTVEC)—R/W:中断向量。
指定当前中断的中断向量。取值范围为10h到FEh。

参考:
1,Intel? 82093AA I/O Advanced Programmable Interrupt Controller (I/O APIC) Datasheet
http://www.intel.com/design/chipsets/datashts/290566.htm
Intel? 82093AA I/O Advanced Programmable Interrupt Controller (I/O APIC) Specification Update
http://www.intel.com/design/chipsets/specupdt/290710.htm