2

当我运行“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”等的中断号

4

1 回答 1

6

在 x86NMIs上总是在中断向量 2 上。这个数字是硬编码的,就像常见的异常(除以 0、页面错误等)一样。您可以在 Intel/AMD 的 CPU 文档中找到它。

如果APIC启用(如问题中提出的转储中的情况),则可以从 APIC 的SVR寄存器中获得虚假中断的中断向量号。同样,请参阅相同的 CPU 文档。

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

    /* 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 中找到它们的中断向量,就像上面的伪中断一样。

于 2012-07-08T04:49:01.060 回答