当我运行" 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"等
答案 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);
应该回答杂散中断向量部分。
对于LOC
和PMI
,我认为这些是本地APIC的中断,你可以从APIC找到它们的中断向量,就像上面的Spurious Interrupt一样。