如何获得中断向量?

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"等的中断号.

Ale*_*nze 6

在x86 NMIs上总是在中断向量2上.该数字被硬编码为常见异常(除以0,页面错误等).您可以在Intel/AMD的CPU文档中找到它.

如果APIC启用(如问题中提供的转储中的情况),可以从APIC的SVR寄存器获得杂散中断的中断向量编号.再次,请参阅相同的CPU文档.

如果APIC没有使能,而是PIC正在使用,那么杂散中断将被传送IRQ7(参见8259APIC芯片规范).该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)

这应该回答杂散中断向量部分.

至于LOCPMI,我认为,这些是本地APIC的中断,你可以从APIC找到它们的中断向量,就像上面的Spurious Interrupt一样.