Sea*_*ean 2 linux hardware x86 assembly linux-kernel
当我运行"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
Run Code Online (Sandbox Code Playgroud)
如何获取"NMI""LOC""SPU""PMI"等的中断号.
在x86 NMIs
上总是在中断向量2上.该数字被硬编码为常见异常(除以0,页面错误等).您可以在Intel/AMD的CPU文档中找到它.
如果APIC
启用(如问题中提供的转储中的情况),可以从APIC的SVR
寄存器获得杂散中断的中断向量编号.再次,请参阅相同的CPU文档.
如果APIC
没有使能,而是PIC
正在使用,那么杂散中断将被传送IRQ7
(参见8259A
PIC芯片规范).该BIOS
方案的石化公司这样的方式IRQ7是中断向量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);
Run Code Online (Sandbox Code Playgroud)
这应该回答杂散中断向量部分.
至于LOC
和PMI
,我认为,这些是本地APIC的中断,你可以从APIC找到它们的中断向量,就像上面的Spurious Interrupt一样.