来自x86系统中的外部设备的中断。 第2部分。Linux内核引导选项

上一部分中,我们研究了x86系统(PIC→APIC→MSI)中设备的中断传递的发展,一般理论以及所有必要的术语。

在本实用部分中,我们将研究如何回滚到使用旧版Linux中断传递方法,即考虑内核引导选项:

  • pci = nomsi
  • Noapic
  • 空腹的

我们还将查看操作系统查看中断路由表(ACPI / MPtable / $ PIR)的顺序,以及它对添加引导选项的影响:

  • pci = noacpi
  • acpi = noirq
  • acpi =关闭

当设备由于中断问题而无法工作时,也许您尝试了所有这些选项的组合。 让我们看看它们到底是做什么的,以及它们如何改变/ proc / interrupts的输出。

无需其他选项即可下载


我们将在自定义板上使用Intel Haswell i7和lynxPoint-LP芯片组(在其上运行coreboot )观察中断。

我们将通过命令输出有关中断的信息

cat /proc/interrupts 

引导时输出,无其他选项:

 CPU0 CPU1 CPU2 CPU3 0: 15 0 0 0 IO-APIC-edge timer 1: 0 1 0 1 IO-APIC-edge i8042 8: 0 0 0 1 IO-APIC-edge rtc0 9: 0 0 0 0 IO-APIC-fasteoi acpi 12: 0 0 0 1 IO-APIC-edge 23: 16 247 7 10 IO-APIC-fasteoi ehci_hcd:usb1 56: 0 0 0 0 PCI-MSI-edge aerdrv,PCIe PME 57: 0 0 0 0 PCI-MSI-edge aerdrv,PCIe PME 58: 0 0 0 0 PCI-MSI-edge aerdrv,PCIe PME 59: 0 0 0 0 PCI-MSI-edge aerdrv,PCIe PME 60: 0 0 0 0 PCI-MSI-edge aerdrv,PCIe PME 61: 0 0 0 0 PCI-MSI-edge aerdrv,PCIe PME 62: 3118 1984 972 3454 PCI-MSI-edge ahci 63: 1 0 0 0 PCI-MSI-edge eth59 64: 2095 57 4 832 PCI-MSI-edge eth59-rx-0 65: 6 18 1 1309 PCI-MSI-edge eth59-rx-1 66: 13 512 2 1 PCI-MSI-edge eth59-rx-2 67: 10 61 232 2 PCI-MSI-edge eth59-rx-3 68: 169 0 0 0 PCI-MSI-edge eth59-tx-0 69: 14 14 4 205 PCI-MSI-edge eth59-tx-1 70: 11 491 3 0 PCI-MSI-edge eth59-tx-2 71: 20 19 134 50 PCI-MSI-edge eth59-tx-3 72: 0 0 0 0 PCI-MSI-edge eth58 73: 2 1 0 152 PCI-MSI-edge eth58-rx-0 74: 3 150 2 0 PCI-MSI-edge eth58-rx-1 75: 2 34 117 2 PCI-MSI-edge eth58-rx-2 76: 153 0 2 0 PCI-MSI-edge eth58-rx-3 77: 4 0 2 149 PCI-MSI-edge eth58-tx-0 78: 4 149 2 0 PCI-MSI-edge eth58-tx-1 79: 4 0 117 34 PCI-MSI-edge eth58-tx-2 80: 153 0 2 0 PCI-MSI-edge eth58-tx-3 81: 66 106 2 101 PCI-MSI-edge snd_hda_intel 82: 928 5657 262 224 PCI-MSI-edge i915 83: 545 56 32 15 PCI-MSI-edge snd_hda_intel NMI: 0 0 0 0 Non-maskable interrupts LOC: 4193 3644 3326 3499 Local timer interrupts SPU: 0 0 0 0 Spurious interrupts PMI: 0 0 0 0 Performance monitoring interrupts IWI: 290 233 590 111 IRQ work interrupts RTR: 3 0 0 0 APIC ICR read retries RES: 1339 2163 2404 1946 Rescheduling interrupts CAL: 607 537 475 559 Function call interrupts TLB: 163 202 164 251 TLB shootdowns TRM: 48 48 48 48 Thermal event interrupts THR: 0 0 0 0 Threshold APIC interrupts MCE: 0 0 0 0 Machine check exceptions MCP: 3 3 3 3 Machine check polls ERR: 0 MIS: 0 

/ proc / interrupts文件以以下形式提供有关每个处理器上的中断数量的表:

  • 第一列:中断号
  • CPUx扬声器:每个处理器上的中断计数器
  • 下一栏:中断类型:
    • IO-APIC边缘-I / O APIC控制器的边缘中断
    • IO-APIC-fasteoi-每个I / O APIC控制器的级别中断
    • PCI-MSI边缘-MSI中断
    • XT-PIC-XT-PIC-PIC控制器上的中断(请参阅下文)
  • 最后一列:与此中断关联的设备

因此,就像在现代系统中一样,它们用于支持MSI / MSI-X中断的设备和驱动程序。 其余的中断通过I / O APIC路由。

可以这样绘制简化的中断路由方案(活动路径标记为红色,未使用路径标记为黑色)。



对MSI / MSI-X设备的支持应在其PCI配置空间中标记为相应的功能。

作为确认,我们为设备指示其使用MSI / MSI-X的lspci输出给出一小部分。 在我们的情况下,它是一个SATA控制器(ahci中断),2个以太网控制器(eth58 *和eth59 *中断),一个图形控制器(i915)和2个HD音频控制器(snd_hda_intel)。

 lspci -v 

 00:02.0 VGA compatible controller: Intel Corporation Haswell-ULT Integrated Graphics Controller (rev 09) (prog-if 00 [VGA controller]) ... Capabilities: [90] MSI: Enable+ Count=1/1 Maskable- 64bit- Capabilities: [d0] Power Management version 2 Capabilities: [a4] PCI Advanced Features Kernel driver in use: i915 00:03.0 Audio device: Intel Corporation Haswell-ULT HD Audio Controller (rev 09 ... Capabilities: [60] MSI: Enable+ Count=1/1 Maskable- 64bit- Capabilities: [70] Express Root Complex Integrated Endpoint, MSI 00 Kernel driver in use: snd_hda_intel 00:1b.0 Audio device: Intel Corporation 8 Series HD Audio Controller (rev 04) ... Capabilities: [60] MSI: Enable+ Count=1/1 Maskable- 64bit+ Capabilities: [70] Express Root Complex Integrated Endpoint, MSI 00 Capabilities: [100] Virtual Channel Kernel driver in use: snd_hda_intel 00:1f.2 SATA controller: Intel Corporation 8 Series SATA Controller 1 [AHCI mode] (rev 04) (prog-if 01 [AHCI 1.0]) ... Capabilities: [80] MSI: Enable+ Count=1/1 Maskable- 64bit- Capabilities: [70] Power Management version 3 Capabilities: [a8] SATA HBA v1.0 Kernel driver in use: ahci 05:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01) ... Capabilities: [50] MSI: Enable- Count=1/1 Maskable+ 64bit+ Capabilities: [70] MSI-X: Enable+ Count=10 Masked- Capabilities: [a0] Express Endpoint, MSI 00 Kernel driver in use: igb 05:00.1 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01) ... Capabilities: [50] MSI: Enable- Count=1/1 Maskable+ 64bit+ Capabilities: [70] MSI-X: Enable+ Count=10 Masked- Capabilities: [a0] Express Endpoint, MSI 00 Kernel driver in use: igb 

如我们所见,这些设备的行“ MSI:启用+”或“ MSI-X:启用+”

让我们开始降级系统。 首先,使用pci = nomsi选项引导。

pci = nomsi


使用此选项,MSI中断将变为IO-APIC / XT-PIC,具体取决于所使用的中断控制器。

在这种情况下,我们仍然具有优先级APIC中断控制器,因此图片如下所示:



/ proc / interrupts的输出:

  CPU0 CPU1 CPU2 CPU3 0: 15 0 0 0 IO-APIC-edge timer 1: 0 1 0 1 IO-APIC-edge i8042 8: 0 0 1 0 IO-APIC-edge rtc0 9: 0 0 0 0 IO-APIC-fasteoi acpi 12: 0 0 0 1 IO-APIC-edge 16: 1314 5625 342 555 IO-APIC-fasteoi i915, snd_hda_intel, eth59 17: 5 0 1 34 IO-APIC-fasteoi eth58 21: 2882 2558 963 2088 IO-APIC-fasteoi ahci 22: 26 81 2 170 IO-APIC-fasteoi snd_hda_intel 23: 23 369 8 8 IO-APIC-fasteoi ehci_hcd:usb1 NMI: 0 0 0 0 Non-maskable interrupts LOC: 3011 3331 2435 2617 Local timer interrupts SPU: 0 0 0 0 Spurious interrupts PMI: 0 0 0 0 Performance monitoring interrupts IWI: 197 228 544 85 IRQ work interrupts RTR: 3 0 0 0 APIC ICR read retries RES: 1708 2349 1821 1569 Rescheduling interrupts CAL: 520 554 509 555 Function call interrupts TLB: 187 181 205 179 TLB shootdowns TRM: 102 102 102 102 Thermal event interrupts THR: 0 0 0 0 Threshold APIC interrupts MCE: 0 0 0 0 Machine check exceptions MCP: 2 2 2 2 Machine check polls ERR: 0 MIS: 0 

所有的MSI / MSI-X中断都将消失。 相反,设备现在使用IO-APIC-fasteoi中断。

请注意,在包含此选项之前,eth58和eth59分别有9个中断! 现在一次只能一次。 的确,我们记得,没有MSI的一项PCI功能,只有一个中断可用!

来自dmesg的有关初始化以太网控制器的一些信息:

-不带pci = nomsi选项的下载:

 igb: Intel(R) Gigabit Ethernet Network Driver - version 5.0.5-k igb: Copyright (c) 2007-2013 Intel Corporation. acpi:acpi_pci_irq_enable: igb 0000:05:00.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16 igb 0000:05:00.0: irq 63 for MSI/MSI-X igb 0000:05:00.0: irq 64 for MSI/MSI-X igb 0000:05:00.0: irq 65 for MSI/MSI-X igb 0000:05:00.0: irq 66 for MSI/MSI-X igb 0000:05:00.0: irq 67 for MSI/MSI-X igb 0000:05:00.0: irq 68 for MSI/MSI-X igb 0000:05:00.0: irq 69 for MSI/MSI-X igb 0000:05:00.0: irq 70 for MSI/MSI-X igb 0000:05:00.0: irq 71 for MSI/MSI-X igb 0000:05:00.0: irq 63 for MSI/MSI-X igb 0000:05:00.0: irq 64 for MSI/MSI-X igb 0000:05:00.0: irq 65 for MSI/MSI-X igb 0000:05:00.0: irq 66 for MSI/MSI-X igb 0000:05:00.0: irq 67 for MSI/MSI-X igb 0000:05:00.0: irq 68 for MSI/MSI-X igb 0000:05:00.0: irq 69 for MSI/MSI-X igb 0000:05:00.0: irq 70 for MSI/MSI-X igb 0000:05:00.0: irq 71 for MSI/MSI-X igb 0000:05:00.0: added PHC on eth0 igb 0000:05:00.0: Intel(R) Gigabit Ethernet Network Connection igb 0000:05:00.0: eth0: (PCIe:5.0Gb/s:Width x1) 00:15:d5:03:00:2a igb 0000:05:00.0: eth0: PBA No: 106300-000 igb 0000:05:00.0: Using MSI-X interrupts. 4 rx queue(s), 4 tx queue(s) acpi:acpi_pci_irq_enable: igb 0000:05:00.1: PCI INT B -> GSI 17 (level, low) -> IRQ 17 igb 0000:05:00.1: irq 72 for MSI/MSI-X igb 0000:05:00.1: irq 73 for MSI/MSI-X igb 0000:05:00.1: irq 74 for MSI/MSI-X igb 0000:05:00.1: irq 75 for MSI/MSI-X igb 0000:05:00.1: irq 76 for MSI/MSI-X igb 0000:05:00.1: irq 77 for MSI/MSI-X igb 0000:05:00.1: irq 78 for MSI/MSI-X igb 0000:05:00.1: irq 79 for MSI/MSI-X igb 0000:05:00.1: irq 80 for MSI/MSI-X igb 0000:05:00.1: irq 72 for MSI/MSI-X igb 0000:05:00.1: irq 73 for MSI/MSI-X igb 0000:05:00.1: irq 74 for MSI/MSI-X igb 0000:05:00.1: irq 75 for MSI/MSI-X igb 0000:05:00.1: irq 76 for MSI/MSI-X igb 0000:05:00.1: irq 77 for MSI/MSI-X igb 0000:05:00.1: irq 78 for MSI/MSI-X igb 0000:05:00.1: irq 79 for MSI/MSI-X igb 0000:05:00.1: irq 80 for MSI/MSI-X igb 0000:05:00.1: added PHC on eth1 igb 0000:05:00.1: Intel(R) Gigabit Ethernet Network Connection igb 0000:05:00.1: eth1: (PCIe:5.0Gb/s:Width x1) 00:15:d5:03:00:2b igb 0000:05:00.1: eth1: PBA No: 106300-000 igb 0000:05:00.1: Using MSI-X interrupts. 4 rx queue(s), 4 tx queue(s) 

-使用pci = nomsi选项启动

 igb: Intel(R) Gigabit Ethernet Network Driver - version 5.0.5-k igb: Copyright (c) 2007-2013 Intel Corporation. acpi:acpi_pci_irq_enable: igb 0000:05:00.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16 igb 0000:05:00.0: added PHC on eth0 igb 0000:05:00.0: Intel(R) Gigabit Ethernet Network Connection igb 0000:05:00.0: eth0: (PCIe:5.0Gb/s:Width x1) 00:15:d5:03:00:2a igb 0000:05:00.0: eth0: PBA No: 106300-000 igb 0000:05:00.0: Using legacy interrupts. 1 rx queue(s), 1 tx queue(s) acpi:acpi_pci_irq_enable: igb 0000:05:00.1: PCI INT B -> GSI 17 (level, low) -> IRQ 17 igb 0000:05:00.1: added PHC on eth1 igb 0000:05:00.1: Intel(R) Gigabit Ethernet Network Connection igb 0000:05:00.1: eth1: (PCIe:5.0Gb/s:Width x1) 00:15:d5:03:00:2b igb 0000:05:00.1: eth1: PBA No: 106300-000 igb 0000:05:00.1: Using legacy interrupts. 1 rx queue(s), 1 tx queue(s) 

由于减少了每个设备的中断数量,因此启用此选项可能会严重限制驱动程序性能(这没有考虑到以下事实:根据英特尔通过使用消息信号中断减少中断延迟的规定,通过MSI进行的中断比通过IO进行中断的速度快3倍) -APIC,比通过PIC快5倍)。

Noapic


此选项禁用I / O APIC。 MSI中断仍然可以到达所有CPU,但是来自设备的中断只能到达CPU0,因为PIC仅连接到CPU0。 但是LAPIC可以工作,其他CPU可以工作并处理中断。



  CPU0 CPU1 CPU2 CPU3 0: 5 0 0 0 XT-PIC-XT-PIC timer 1: 2 0 0 0 XT-PIC-XT-PIC i8042 2: 0 0 0 0 XT-PIC-XT-PIC cascade 8: 1 0 0 0 XT-PIC-XT-PIC rtc0 9: 0 0 0 0 XT-PIC-XT-PIC acpi 12: 172 0 0 0 XT-PIC-XT-PIC ehci_hcd:usb1 56: 0 0 0 0 PCI-MSI-edge aerdrv, PCIe PME 57: 0 0 0 0 PCI-MSI-edge aerdrv, PCIe PME 58: 0 0 0 0 PCI-MSI-edge aerdrv, PCIe PME 59: 0 0 0 0 PCI-MSI-edge aerdrv, PCIe PME 60: 0 0 0 0 PCI-MSI-edge aerdrv, PCIe PME 61: 0 0 0 0 PCI-MSI-edge aerdrv, PCIe PME 62: 2833 2989 1021 811 PCI-MSI-edge ahci 63: 0 1 0 0 PCI-MSI-edge eth59 64: 301 52 9 3 PCI-MSI-edge eth59-rx-0 65: 12 24 3 178 PCI-MSI-edge eth59-rx-1 66: 14 85 6 2 PCI-MSI-edge eth59-rx-2 67: 17 24 307 1 PCI-MSI-edge eth59-rx-3 68: 70 18 8 10 PCI-MSI-edge eth59-tx-0 69: 7 0 0 23 PCI-MSI-edge eth59-tx-1 70: 15 227 2 2 PCI-MSI-edge eth59-tx-2 71: 18 6 27 2 PCI-MSI-edge eth59-tx-3 72: 0 0 0 0 PCI-MSI-edge eth58 73: 1 0 0 27 PCI-MSI-edge eth58-rx-0 74: 1 22 0 5 PCI-MSI-edge eth58-rx-1 75: 1 0 22 5 PCI-MSI-edge eth58-rx-2 76: 23 0 0 5 PCI-MSI-edge eth58-rx-3 77: 1 0 0 27 PCI-MSI-edge eth58-tx-0 78: 1 22 0 5 PCI-MSI-edge eth58-tx-1 79: 1 0 22 5 PCI-MSI-edge eth58-tx-2 80: 23 0 0 5 PCI-MSI-edge eth58-tx-3 81: 187 17 70 7 PCI-MSI-edge snd_hda_intel 82: 698 1647 247 129 PCI-MSI-edge i915 83: 438 135 16 59 PCI-MSI-edge snd_hda_intel NMI: 0 0 0 0 Non-maskable interrupts LOC: 1975 2499 2245 1474 Local timer interrupts SPU: 0 0 0 0 Spurious interrupts PMI: 0 0 0 0 Performance monitoring interrupts IWI: 132 67 429 91 IRQ work interrupts RTR: 3 0 0 0 APIC ICR read retries RES: 1697 2178 1903 1541 Rescheduling interrupts CAL: 561 496 534 567 Function call interrupts TLB: 229 254 170 137 TLB shootdowns TRM: 78 78 78 78 Thermal event interrupts THR: 0 0 0 0 Threshold APIC interrupts MCE: 0 0 0 0 Machine check exceptions MCP: 2 2 2 2 Machine check polls ERR: 0 MIS: 0 

如您所见,所有IO-APIC- *中断都变成了XT-PIC-XT-PIC,这些中断仅在CPU0上路由。 MSI中断保持不变,并进入所有CPU0-3。

空腹的


禁用LAPIC。 没有LAPIC,MSI中断将无法工作;没有LAPIC,I / O APIC将无法工作。 因此,来自设备的所有中断都将到达PIC,并且仅适用于CPU0。 如果没有LAPIC,其他CPU甚至无法在系统中工作。



/ proc / interrupts的输出:

  CPU0 0: 6416 XT-PIC-XT-PIC timer 1: 2 XT-PIC-XT-PIC i8042 2: 0 XT-PIC-XT-PIC cascade 3: 5067 XT-PIC-XT-PIC aerdrv, aerdrv, PCIe PME, PCIe PME, i915, snd_hda_intel, eth59 4: 32 XT-PIC-XT-PIC aerdrv, aerdrv, PCIe PME, PCIe PME, eth58 5: 0 XT-PIC-XT-PIC aerdrv, PCIe PME 6: 0 XT-PIC-XT-PIC aerdrv, PCIe PME 8: 1 XT-PIC-XT-PIC rtc0 9: 0 XT-PIC-XT-PIC acpi 11: 274 XT-PIC-XT-PIC snd_hda_intel 12: 202 XT-PIC-XT-PIC ehci_hcd:usb1 15: 7903 XT-PIC-XT-PIC ahci NMI: 0 Non-maskable interrupts LOC: 0 Local timer interrupts SPU: 0 Spurious interrupts PMI: 0 Performance monitoring interrupts IWI: 0 IRQ work interrupts RTR: 0 APIC ICR read retries RES: 0 Rescheduling interrupts CAL: 0 Function call interrupts TLB: 0 TLB shootdowns TRM: 0 Thermal event interrupts THR: 0 Threshold APIC interrupts MCE: 0 Machine check exceptions MCP: 1 Machine check polls ERR: 0 MIS: 0 

组合:


实际上,新版本只有一个:“ noapic pci = nomsi”。 来自设备的所有中断只能通过PIC进入CPU0。 但是LAPIC可以工作,其他CPU可以工作并处理中断。

第一,因为您无法将任何内容与“ nolapic”组合使用,因为 此选项将使I / O APIC和MSI不可用。 因此,如果您曾经给引导选项指定了“ noapic nolapic”(或者最常见的选项“ acpi = off noapic nolapic”),那么显然您输入了额外的字母。

因此,“ noapic pci = nomsi”选项将发生什么:



/ proc / interrupts的输出:

  CPU0 CPU1 CPU2 CPU3 0: 5 0 0 0 XT-PIC-XT-PIC timer 1: 2 0 0 0 XT-PIC-XT-PIC i8042 2: 0 0 0 0 XT-PIC-XT-PIC cascade 3: 5072 0 0 0 XT-PIC-XT-PIC i915, snd_hda_intel, eth59 4: 32 0 0 0 XT-PIC-XT-PIC eth58 8: 1 0 0 0 XT-PIC-XT-PIC rtc0 9: 0 0 0 0 XT-PIC-XT-PIC acpi 11: 281 0 0 0 XT-PIC-XT-PIC snd_hda_intel 12: 200 0 0 0 XT-PIC-XT-PIC ehci_hcd:usb1 15: 7930 0 0 0 XT-PIC-XT-PIC ahci NMI: 0 0 0 0 Non-maskable interrupts LOC: 2595 2387 2129 1697 Local timer interrupts SPU: 0 0 0 0 Spurious interrupts PMI: 0 0 0 0 Performance monitoring interrupts IWI: 159 90 482 135 IRQ work interrupts RTR: 3 0 0 0 APIC ICR read retries RES: 1568 1666 1810 1833 Rescheduling interrupts CAL: 431 556 549 558 Function call interrupts TLB: 124 184 156 274 TLB shootdowns TRM: 116 116 116 116 Thermal event interrupts THR: 0 0 0 0 Threshold APIC interrupts MCE: 0 0 0 0 Machine check exceptions MCP: 2 2 2 2 Machine check polls ERR: 0 MIS: 0 

中断路由表和选项“ acpi = noirq”,“ pci = noacpi”,“ acpi = off”


操作系统如何从设备接收中断路由信息? BIOS通过以下形式为操作系统准备信息:

  • ACPI表(_PIC / _PRT方法)
  • _MP_表(MPtable)
  • $ PIR表
  • 寄存器0x3C / 0x3D PCI设备配置空间

应当注意,BIOS不需要做任何额外的事情来指示MSI的中断;上述所有信息仅对于APIC / PIC中断线才需要。

上面列表中的表按优先级顺序显示。 让我们更详细地考虑它。

假设BIOS提供了所有这些数据,并且我们在启动时没有任何其他选项:

  • 操作系统找到ACPI表
  • 操作系统执行ACPI方法“ _PIC”,并向其传递需要以APIC模式加载的参数。 此处,方法代码通常将所选模式保存在变量中(例如PICM = 1)
  • 为了获取有关中断的数据,操作系统将调用ACPI方法“ _PRT”。 它在内部检查PICM变量,并返回APIC情况的路由

如果我们使用noapic选项引导:

  • 操作系统找到ACPI表
  • 操作系统执行ACPI方法“ _PIC”,并将必须在PIC模式下启动的参数传递给它。 此处,方法代码通常将所选模式保存在变量中(例如PICM = 0)
  • 为了获取有关中断的数据,操作系统将调用ACPI方法“ _PRT”。 它在内部检查PICM变量并返回PIC情况的路由

如果缺少ACPI表或使用acpi = noirqpci = noacpi选项禁用了通过ACPI的中断路由功能(或者使用acpi = off完全关闭了ACPI ),则操作系统会寻找用于路由中断的MPtable(_MP_)表:

  • 操作系统找不到/不查看ACPI表
  • 操作系统发现MPtable(_MP_)

如果缺少ACPI表或使用acpi = noirqpci = noacpi选项禁用了通过ACPI的中断路由功能(或者使用acpi = off完全关闭了ACPI ),并且缺少MPtable(_MP_)表(或者通过了noapicnolapic引导选项):

  • 操作系统找不到/请参阅ACPI表
  • 操作系统找不到/不查看表MPtable(_MP_)
  • 操作系统找到$ PIR表

如果没有$ PIR表,或者它不完整,则操作系统猜测中断将查看PCI设备配置空间中寄存器0x3C / 0x3D的值。

我们用以下图片总结以上所有内容:



应当记住,并非每个BIOS都提供全部3个表(ACPI / MPtable / $ PIR),因此如果将选项传递给加载程序以拒绝使用ACPI或ACPI和MPtable进行路由中断,则远离系统将启动的事实。

注意1 :如果我们尝试使用acpi = noirq选项在APIC模式下引导并且不存在MPtable,则中断的画面将与仅使用noapic选项的正常引导情况相同。 操作系统本身将进入PIC中断模式。
如果我们尝试在完全不使用ACPI表的情况下启动(acpi = off),并且不提供MPtable,则图片将如下所示:
  CPU0 0: 6 XT-PIC-XT-PIC timer 1: 2 XT-PIC-XT-PIC i8042 2: 0 XT-PIC-XT-PIC cascade 8: 0 XT-PIC-XT-PIC rtc0 12: 373 XT-PIC-XT-PIC ehci_hcd:usb1 16: 0 PCI-MSI-edge PCIe PME 17: 0 PCI-MSI-edge PCIe PME 18: 0 PCI-MSI-edge PCIe PME 19: 0 PCI-MSI-edge PCIe PME 20: 0 PCI-MSI-edge PCIe PME 21: 0 PCI-MSI-edge PCIe PME 22: 8728 PCI-MSI-edge ahci 23: 1 PCI-MSI-edge eth59 24: 1301 PCI-MSI-edge eth59-rx-0 25: 113 PCI-MSI-edge eth59-tx-0 26: 0 PCI-MSI-edge eth58 27: 45 PCI-MSI-edge eth58-rx-0 28: 45 PCI-MSI-edge eth58-tx-0 29: 1280 PCI-MSI-edge snd_hda_intel NMI: 2 Non-maskable interrupts LOC: 24076 Local timer interrupts SPU: 0 Spurious interrupts PMI: 2 Performance monitoring interrupts IWI: 2856 IRQ work interrupts RTR: 0 APIC ICR read retries RES: 0 Rescheduling interrupts CAL: 0 Function call interrupts TLB: 0 TLB shootdowns TRM: 34 Thermal event interrupts THR: 0 Threshold APIC interrupts MCE: 0 Machine check exceptions MCP: 2 Machine check polls ERR: 0 MIS: 0 

发生这种情况的原因是,如果没有MADT表( 多个APIC描述表 )的ACPI和MPtable的必要信息,操作系统将不知道其他处理器的APIC标识符(APIC ID)并且无法与它们一起使用,但是主处理器的LAPIC可以工作。因为我们没有禁止这样做,所以MSI中断可能会发生。 也就是说,它将是这样的:



注2 :通常,在使用API​​C的情况下使用ACPI时的中断路由与通过MPtable进行的中断路由相同。 在PIC情况下,ACPI中断路由与通过$ PIR进行的中断路由相同。 因此,/ proc / interrupts的结论不应有所不同。 但是,在研究过程中,我注意到了一个奇怪之处。 通过MPtable进行路由时,由于某种原因,输出包含级联中断“ XT-PIC-XT-PIC级联”。

  CPU0 CPU1 CPU2 CPU3 0: 15 0 0 0 IO-APIC-edge timer 1: 2 0 0 0 IO-APIC-edge i8042 2: 0 0 0 0 XT-PIC-XT-PIC cascade 8: 0 1 0 0 IO-APIC-edge rtc0 9: 0 0 0 0 IO-APIC-edge acpi ... 

发生这种情况有点奇怪,但是内核文档似乎说这很正常。

结论:


总之,我们再次表示已解析的选项。

中断控制器选择选项:

  • pci = nomsi-根据使用的中断控制器,MSI中断将变为IO-APIC / XT-PIC
  • noapic-禁用I / O APIC。 MSI中断仍然可以到达所有CPU,来自设备的其他中断只能到达PIC,并且仅适用于CPU0。 但是LAPIC可以工作,其他CPU可以工作并处理中断
  • noapic pci = nomsi-来自设备的所有中断只能发送到PIC,并且仅适用于CPU0。 但是LAPIC可以工作,其他CPU可以工作并处理中断
  • nolapic-禁用LAPIC。 没有LAPIC,MSI中断将无法工作;没有LAPIC,I / O APIC将无法工作。 来自设备的所有中断都将发送到PIC,并且仅适用于CPU0。 如果没有LAPIC,CPU的其余部分将无法工作。

选择中断路由优先级表的选项:

  • 没有选项 -使用ACPI表通过APIC进行路由
  • noapic-使用ACPI表通过PIC进行路由
  • acpi = noirqpci = noacpi / acpi = off )-使用MPtable通过APIC进行路由
  • acpi = noirqpci = noacpi / acpi = offnoapicnolapic )-使用$ PIR表通过PIC进行路由

在下一部分中,我们将看到coreboot如何配置芯片组以路由中断。

Source: https://habr.com/ru/post/zh-CN431372/


All Articles