Na
parte anterior, examinamos a evolução da entrega de interrupções de dispositivos em sistemas x86 (PIC → APIC → MSI), uma teoria geral e todos os termos necessários.
Nesta parte prática, veremos como reverter o uso de métodos legados de entrega de interrupção do Linux, ou seja, considere as opções de inicialização do kernel:
- pci = nomsi
- noapic
- nolápico
Também veremos a ordem na qual o sistema operacional analisa as tabelas de roteamento de interrupção (ACPI / MPtable / $ PIR) e como ele será afetado pela adição de opções de inicialização:
- pci = noacpi
- acpi = noirq
- acpi = desativado
Talvez você tenha tentado combinações de todas essas opções quando um dispositivo não funcionou devido a um problema de interrupção. Vamos ver o que exatamente eles fazem e como eles mudam a saída de / proc / interrupts.
Download sem opções adicionais
Veremos as interrupções neste artigo em uma placa personalizada com o Intel Haswell i7 com o chipset lynxPoint-LP no qual o
coreboot está sendo executado.
Produziremos informações sobre interrupções através do comando
cat /proc/interrupts
Saída na inicialização sem opções adicionais:
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
O arquivo / proc / interrupts fornece uma tabela sobre o número de interrupções em cada processador, da seguinte forma:
- Primeira coluna: número da interrupção
- Alto-falantes CPUx: contadores de interrupção em cada processador
- Próxima coluna: tipo de interrupção:
- IO-APIC-edge - interrupção de borda no controlador I / O APIC
- IO-APIC-fasteoi - interrupção de nível por controlador de E / S APIC
- Borda PCI-MSI - interrupção MSI
- XT-PIC-XT-PIC - interrupção no controlador PIC (veja mais adiante)
- Última coluna: dispositivo associado a esta interrupção
Portanto, como deveria ser em um sistema moderno, eles são usados para dispositivos e drivers que suportam interrupções MSI / MSI-X. As interrupções restantes são roteadas através do E / S APIC.
O esquema de roteamento de interrupção simplificado pode ser desenhado assim (caminhos ativos marcados em vermelho, caminhos não utilizados em preto).

O suporte para um dispositivo MSI / MSI-X deve ser rotulado como Capacidade correspondente em seu espaço de configuração PCI.
Como confirmação, fornecemos um pequeno fragmento da saída lspci para dispositivos para os quais é indicado que eles usam MSI / MSI-X. No nosso caso, este é um controlador SATA (interrupção ahci), 2 controladores ethernet (interrompe eth58 * e eth59 *), um controlador gráfico (i915) e 2 controladores HD Audio (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
Como podemos ver, esses dispositivos têm a linha "MSI: Enable +" ou "MSI-X: Enable +"
Vamos começar a degradar o sistema. Primeiro, inicialize com a opção pci = nomsi.
pci = nomsi
Com esta opção, as interrupções MSI se tornarão IO-APIC / XT-PIC, dependendo do controlador de interrupção usado.
Nesse caso, ainda temos o controlador de interrupção APIC prioritário, portanto a imagem será assim:

A saída de / proc / interrompe:
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
Espera-se que todas as interrupções do MSI / MSI-X desapareçam. Em vez disso, os dispositivos agora usam interrupções IO-APIC-fasteoi.
Observe que antes da inclusão dessa opção, eth58 e eth59 tiveram 9 interrupções cada! E agora apenas um de cada vez. Afinal, como lembramos, sem MSI uma função PCI, apenas uma interrupção está disponível!
Algumas informações do dmesg sobre a inicialização de controladores ethernet:
- faça o download sem a opção 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)
- inicialize com a opção 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)
Devido à redução no número de interrupções por dispositivo, ativar essa opção pode limitar significativamente o desempenho do driver (isso não leva em consideração o fato de que, de acordo com a Intel
Reduzindo a latência de interrupção através do uso de interrupções sinalizadas por mensagem, as interrupções no MSI são 3 vezes mais rápidas que no IO -APIC e 5 vezes mais rápido que através do PIC).
noapic
Esta opção desativa o E / S APIC. As interrupções do MSI ainda podem ir para todas as CPUs, mas as interrupções dos dispositivos só podem ir para a CPU0, pois o PIC está conectado apenas à CPU0. Mas o LAPIC funciona e outras CPUs podem funcionar e lidar com interrupções.

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
Como você pode ver, todas as interrupções IO-APIC- * se transformaram em XT-PIC-XT-PIC, e essas interrupções são roteadas apenas na CPU0. As interrupções MSI permanecem inalteradas e vão para todas as CPU0-3.
nolápico
Desativa LAPIC. Interrupções MSI não podem funcionar sem LAPIC, E / S APIC não pode funcionar sem LAPIC. Portanto, todas as interrupções dos dispositivos irão para o PIC e só funcionam com a CPU0. E sem o LAPIC, outras CPUs nem funcionarão no sistema.

A saída de / proc / interrompe:
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
Combinações:
De fato, existe apenas um para a nova versão: "noapic pci = nomsi". Todas as interrupções dos dispositivos só podem ir para a CPU0 através do PIC. Mas o LAPIC funciona e outras CPUs podem funcionar e lidar com interrupções.
Um, porque você não pode combinar nada com "nolápico", porque essa opção tornará I / O APIC e MSI indisponíveis. Portanto, se você prescreveu as opções de inicialização "noapic nolapic" (ou a opção mais comum "acpi = off noapic nolapic"), aparentemente você digitou letras extras.
Então, o que acontecerá com as opções "noapic pci = nomsi":

A saída de / proc / interrompe:
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
Tabelas e opções de roteamento de interrupção “acpi = noirq”, “pci = noacpi”, “acpi = off”
Como o sistema operacional recebe informações de roteamento de interrupção dos dispositivos? O BIOS prepara informações para o sistema operacional na forma de:
- Tabelas ACPI (métodos _PIC / _PRT)
- Tabelas _MP_ (MPtable)
- Mesas $ PIR
- Registra o espaço de configuração do dispositivo 0x3C / 0x3D PCI
Deve-se notar que o BIOS não precisa fazer nada extra para indicar interrupções no MSI; todas as informações acima são necessárias apenas para linhas de interrupção APIC / PIC.
As tabelas na lista acima são indicadas em ordem de prioridade. Vamos considerar com mais detalhes.
Suponha que o BIOS tenha fornecido todos esses dados e inicializamos sem nenhuma opção adicional:
- OS encontra tabelas ACPI
- O sistema operacional executa o método ACPI "_PIC", passa o argumento de que ele precisa ser carregado no modo APIC. Aqui, o código do método geralmente salva o modo selecionado em uma variável (por exemplo, PICM = 1)
- Para obter dados sobre interrupções, o sistema operacional chama o método ACPI "_PRT". Ele verifica a variável PICM internamente e retorna o roteamento para o caso APIC
No caso de
iniciarmos com a opção
noapic :
- OS encontra tabelas ACPI
- O sistema operacional executa o método ACPI "_PIC", passa o argumento de que é necessário inicializar no modo PIC. Aqui, o código do método geralmente salva o modo selecionado em uma variável (digamos, PICM = 0)
- Para obter dados sobre interrupções, o sistema operacional chama o método ACPI "_PRT". Ele verifica a variável PICM internamente e retorna o roteamento para o caso PIC
Se a tabela ACPI estiver ausente ou a funcionalidade de roteamento de interrupção por meio do ACPI estiver desativada usando as
opções acpi = noirq ou
pci = noacpi (ou o ACPI for completamente desativado usando
acpi = off ), o SO procurará a tabela MPtable (_MP_) para interrupções de roteamento:
- O SO não encontra / não olha para as tabelas da ACPI
- OS encontra MPtable (_MP_)
Se a tabela ACPI estiver ausente ou a funcionalidade de roteamento de interrupção por meio do ACPI estiver desativada usando as
opções acpi = noirq ou
pci = noacpi (ou o ACPI está completamente desativado usando
acpi = off ) e se a tabela MPtable (_MP_) estiver ausente (ou a opção de inicialização
noapic ou
nolapic for
aprovada ):
- O SO não encontra / vê a tabela ACPI
- O SO não encontra / não olha para a tabela MPtable (_MP_)
- OS encontra a tabela $ PIR
Se não houver uma tabela $ PIR ou ela não estiver concluída, o sistema operacional para adivinhar interrupções examinará os valores dos registros 0x3C / 0x3D do espaço de configuração do dispositivo PCI.
Resumimos todas as opções acima com a seguinte imagem:

Deve-se lembrar que nem todo BIOS fornece todas as 3 tabelas (ACPI / MPtable / $ PIR); portanto, se você passou a opção para o carregador de recusar o uso de ACPI ou ACPI e MPtable para rotear interrupções, isso está longe do fato de seu sistema inicializar.
Nota 1 : se tentarmos inicializar no modo APIC com a opção acpi = noirq e sem MPtable, a imagem das interrupções será a mesma do caso de inicialização normal com a única opção noapic. O próprio sistema operacional entrará no modo de interrupção PIC.
Se tentarmos inicializar sem as tabelas ACPI (acpi = off) e sem fornecer MPtable, a imagem será a seguinte:
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
Isso acontece porque sem a ACPI da tabela MADT (
Tabela de Descrição Múltipla APIC ) e as informações necessárias do MPtable, o sistema operacional não conhece os identificadores APIC (IDs APIC) para outros processadores e não pode trabalhar com eles, mas o LAPIC do processador principal funciona. já que não proibimos isso, e as interrupções do MSI podem ocorrer. Ou seja, será assim:
Nota 2 : em geral, o roteamento de interrupção ao usar o ACPI no caso do APIC é o mesmo que o roteamento de interrupção via MPtable. E o roteamento de interrupção da ACPI no caso do PIC é o mesmo que o roteamento de interrupção por meio do $ PIR. Portanto, as conclusões de / proc / interrupts não devem ser diferentes. No entanto, durante a pesquisa, notei uma estranheza. Ao rotear via MPtable, por algum motivo, a saída contém uma interrupção em cascata “Cascata 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 ...
É um pouco estranho que isso aconteça, mas a
documentação do
kernel parece dizer que isso é normal.
Conclusão:
Em conclusão, denotamos mais uma vez as opções analisadas.
Opções de seleção do controlador de interrupção:
- pci = nomsi - as interrupções MSI se tornarão IO-APIC / XT-PIC, dependendo do controlador de interrupção usado
- noapic - Desativa E / S APIC. As interrupções do MSI ainda podem ir para todas as CPUs, outras interrupções dos dispositivos só podem ir para o PIC e funciona apenas com a CPU0. Mas o LAPIC funciona e outras CPUs podem funcionar e lidar com interrupções
- noapic pci = nomsi - Todas as interrupções dos dispositivos só podem ir para o PIC e só funcionam com a CPU0. Mas o LAPIC funciona e outras CPUs podem funcionar e lidar com interrupções
- nolapic - Desativa LAPIC. Interrupções MSI não podem funcionar sem LAPIC, E / S APIC não pode funcionar sem LAPIC. Todas as interrupções dos dispositivos irão para o PIC e só funcionam com a CPU0. E sem o LAPIC, o restante da CPU não funcionará.
Opções para escolher a tabela de prioridades para roteamento de interrupção:
- sem opções - roteamento através do APIC usando tabelas ACPI
- noapic - roteamento através do PIC usando tabelas ACPI
- acpi = noirq ( pci = noacpi / acpi = off ) - roteamento através do APIC usando o MPtable
- acpi = noirq ( pci = noacpi / acpi = desativado ) noapic ( nolapic ) - roteamento via PIC usando a tabela $ PIR
Na próxima parte, veremos como o coreboot configura o chipset para interrupções de roteamento.