[英]How do I get the interrupt vector number on Linux?
當我運行“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”等中斷號
在 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 查詢此映射,但它是通過向 PIC 發送初始化控制字 2 ( ICW2
) 來建立的。 這是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 中找到它們的中斷向量,就像上面的虛假中斷一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.