当我运行“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”等的中断号
On x86 NMIs
始终位于中断向量 2 上。该数字与常见异常(除以 0、页错误等)一样是硬编码的。您可以在 Intel/AMD 的 CPU 文档中找到它。
If the APIC
已启用(如问题中提出的转储中的情况),虚假中断的中断向量号可以从 APIC 获得SVR
登记。再次,请参阅相关的相同 CPU 文档。
If the APIC
未启用,而是PIC
正在使用,然后虚假中断被传递为IRQ7
(参见8259A
PIC 芯片规格)。这BIOS
以 IRQ7 为中断向量的方式对 PIC 进行编程0Fh
,但 Windows 和 Linux 更改了此映射以避免共享 IRQ 和 CPU 异常的相同中断向量。似乎无法从 PIC 查询此映射,但它是通过发送初始化控制字 2 建立的(ICW2
) 到 PIC。这是相关的 Linux 代码init_8259A() http://lxr.free-electrons.com/source/arch/x86/kernel/i8259.c#L299:
/* ICW2: 8259A-1 IR0-7 mapped to 0x30-0x37 on x86-64,
to 0x20-0x27 on i386 */
outb_pic(IRQ0_VECTOR, PIC_MASTER_IMR);
这应该回答虚假中断向量部分。
As for LOC
and PMI
,我认为,这些是本地 APIC 的中断,您可以从 APIC 找到它们的中断向量,就像上面的虚假中断一样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)