如何获得中断向量?

时间:2012-07-08 00:05:00

标签: linux assembly linux-kernel x86 hardware

当我运行" cat / proc / interrupts"时,我可以得到以下内容:

           CPU0       CPU1
  0:        253       1878   IO-APIC-edge      timer
  1:          3          0   IO-APIC-edge      i8042
  7:          1          0   IO-APIC-edge      parport0
  8:          0          1   IO-APIC-edge      rtc0
  9:          0          0   IO-APIC-fasteoi   acpi
 12:          1          3   IO-APIC-edge      i8042
 16:     681584         60   IO-APIC-fasteoi   uhci_hcd:usb3, nvidia
 17:          0          0   IO-APIC-fasteoi   uhci_hcd:usb4, uhci_hcd:usb7
 18:          0          0   IO-APIC-fasteoi   uhci_hcd:usb8
 22:          2          1   IO-APIC-fasteoi   ehci_hcd:usb1, uhci_hcd:usb5
 23:         17         17   IO-APIC-fasteoi   ehci_hcd:usb2, uhci_hcd:usb6
 44:     146232     472747   PCI-MSI-edge      ahci
 45:        118        115   PCI-MSI-edge      snd_hda_intel
 46:   10038650        842   PCI-MSI-edge      eth1
NMI:      44479      43798   Non-maskable interrupts
LOC:   19025635   29426776   Local timer interrupts
SPU:          0          0   Spurious interrupts
PMI:      44479      43798   Performance monitoring interrupts
IWI:          0          0   IRQ work interrupts
RES: 3442001789 3442627214   Rescheduling interrupts
CAL:       1406       1438   Function call interrupts
TLB:     781318     792403   TLB shootdowns
TRM:          0          0   Thermal event interrupts
THR:          0          0   Threshold APIC interrupts
MCE:          0          0   Machine check exceptions
MCP:       2063       2063   Machine check polls
ERR:          0
MIS:          0

如何获得" NMI"的中断号码? " LOC" " SPU" " PMI"等

1 个答案:

答案 0 :(得分:6)

在x86上NMIs始终在中断向量2上。该数字被硬编码为常见异常(除以0,页面错误等)。您可以在Intel / AMD的CPU文档中找到它。

如果启用APIC(如问题中提供的转储中的情况),可以从APIC的SVR寄存器获取杂散中断的中断向量编号。再次,请参阅相同的CPU文档。

如果未启用APIC而是使用PIC,则虚假中断将以IRQ7的形式发送(请参阅8259A PIC芯片规范)。 BIOS以对IRQ7为中断向量0Fh的方式对PIC进行编程,但Windows和Linux更改此映射以避免为IRQ和CPU异常共享相同的中断向量。似乎无法从PIC查询此映射,但它是通过将初始化控制字2(ICW2)发送到PIC来建立的。这是init_8259A()中相关的Linux代码:

    /* ICW2: 8259A-1 IR0-7 mapped to 0x30-0x37 on x86-64,
       to 0x20-0x27 on i386 */
    outb_pic(IRQ0_VECTOR, PIC_MASTER_IMR);

应该回答杂散中断向量部分。

对于LOCPMI,我认为这些是本地APIC的中断,你可以从APIC找到它们的中断向量,就像上面的Spurious Interrupt一样。