Mengganggu dari perangkat eksternal dalam sistem x86. Bagian 2. Opsi boot kernel Linux

Pada bagian sebelumnya, kami memeriksa evolusi pengiriman interupsi dari perangkat dalam sistem x86 (PIC โ†’ APIC โ†’ MSI), teori umum, dan semua persyaratan yang diperlukan.

Pada bagian praktis ini, kita akan melihat cara memutar kembali menggunakan metode pengiriman interupsi Linux lama, yaitu, pertimbangkan opsi boot kernel:

  • pci = nomsi
  • noapic
  • nolapic

Kami juga akan melihat urutan tampilan OS pada tabel perutean interupsi (ACPI / MPtable / $ PIR) dan bagaimana hal itu akan dipengaruhi oleh penambahan opsi boot:

  • pci = noacpi
  • acpi = noirq
  • acpi = mati

Mungkin Anda mencoba kombinasi semua opsi ini ketika perangkat tidak berfungsi karena masalah interupsi. Mari kita lihat apa yang mereka lakukan dan bagaimana mereka mengubah output dari / proc / interupsi.

Unduh tanpa opsi tambahan


Kami akan melihat gangguan dalam artikel ini di papan kustom dengan Intel Haswell i7 dengan chipset lynxPoint-LP di mana coreboot berjalan.

Kami akan menampilkan informasi tentang interupsi melalui perintah

cat /proc/interrupts 

Output saat boot tanpa opsi tambahan:

 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 

File / proc / interrupts menyediakan tabel jumlah interupsi pada setiap prosesor dalam bentuk berikut:

  • Kolom pertama: nomor interupsi
  • Speaker CPUx: interupsi penghitung pada setiap prosesor
  • Kolom berikutnya: jenis interupsi:
    • IO-APIC-edge - edge interrupt ke pengontrol I / O APIC
    • IO-APIC-fasteoi - level interrupt per I / O APIC controller
    • PCI-MSI-edge - MSI interrupt
    • XT-PIC-XT-PIC - interupsi pada pengontrol PIC (lihat nanti)
  • Kolom terakhir: perangkat yang terkait dengan interupsi ini

Jadi, sebagaimana seharusnya dalam sistem modern, mereka digunakan untuk perangkat dan driver yang mendukung MSI / MSI-X interupsi. Interupsi yang tersisa dialihkan melalui I / O APIC.

Skema perutean interupsi yang disederhanakan dapat digambarkan seperti ini (jalur aktif ditandai dengan merah, jalur tidak terpakai berwarna hitam).



Dukungan untuk perangkat MSI / MSI-X harus diberi label sebagai Kemampuan yang sesuai dalam ruang konfigurasi PCI-nya.

Dalam konfirmasi, kami memberikan sebagian kecil dari output lspci untuk perangkat yang diindikasikan menggunakan MSI / MSI-X. Dalam kasus kami, ini adalah pengontrol SATA (interrupt ahci), 2 pengontrol ethernet (menginterupsi eth58 * dan eth59 *), pengontrol grafis (i915) dan 2 pengontrol Audio 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 

Seperti yang bisa kita lihat, perangkat ini memiliki garis "MSI: Enable +" atau "MSI-X: Enable +"

Mari kita mulai menurunkan sistem. Pertama, boot dengan opsi pci = nomsi.

pci = nomsi


Dengan opsi ini, MSI interupsi akan menjadi IO-APIC / XT-PIC tergantung pada pengontrol interupsi yang digunakan.

Dalam hal ini, kami masih memiliki pengontrol interupsi APIC prioritas, sehingga gambarnya akan seperti ini:



Output dari / proc / interupsi:

  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 

Semua interupsi MSI / MSI-X diperkirakan akan hilang. Sebaliknya, perangkat sekarang menggunakan IO-APIC-fasteoi interupsi.

Perhatikan bahwa sebelum dimasukkannya opsi ini, eth58 dan eth59 masing-masing memiliki 9 interupsi! Dan sekarang hanya satu per satu. Memang, seperti yang kita ingat, tanpa MSI satu fungsi PCI, hanya satu interupsi yang tersedia!

Beberapa informasi dari dmesg tentang menginisialisasi pengontrol ethernet:

- unduh tanpa opsi 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) 

- boot dengan opsi 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) 

Karena berkurangnya jumlah interupsi per perangkat, mengaktifkan opsi ini dapat secara signifikan membatasi kinerja pengemudi (ini tidak memperhitungkan fakta bahwa, menurut Intel Mengurangi Latensi Interupsi Melalui Penggunaan Message Signaled Interrupt, interupsi melalui MSI 3 kali lebih cepat daripada melalui IO -APIC dan 5 kali lebih cepat daripada melalui PIC).

noapic


Opsi ini menonaktifkan I / O APIC. MSI interupsi masih dapat pergi ke semua CPU, tetapi interupsi dari perangkat hanya dapat pergi ke CPU0, karena PIC hanya terhubung ke CPU0. Tetapi LAPIC berfungsi dan CPU lainnya dapat bekerja dan menangani interupsi.



  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 

Seperti yang Anda lihat, semua interupsi IO-APIC- * berubah menjadi XT-PIC-XT-PIC, dan interupsi ini hanya dialihkan pada CPU0. Interupsi MSI tetap tidak berubah dan pergi ke semua CPU0-3.

nolapic


Nonaktifkan LAPIC. MSI interupsi tidak dapat bekerja tanpa LAPIC, I / O APIC tidak dapat bekerja tanpa LAPIC. Oleh karena itu, semua interupsi dari perangkat akan menuju ke PIC, dan hanya bekerja dengan CPU0. Dan tanpa LAPIC, CPU lain bahkan tidak akan berfungsi di sistem.



Output dari / proc / interupsi:

  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 

Kombinasi:


Bahkan, hanya ada satu untuk versi baru: "noapic pci = nomsi". Semua interupsi dari perangkat hanya bisa menuju ke CPU0 melalui PIC. Tetapi LAPIC berfungsi dan CPU lainnya dapat bekerja dan menangani interupsi.

Satu, karena Anda tidak dapat menggabungkan apa pun dengan "nolapic", karena opsi ini akan membuat I / O APIC dan MSI tidak tersedia. Jadi, jika Anda pernah meresepkan opsi boot โ€œnoapic nolapicโ€ (atau opsi paling umum โ€œacpi = off noapic nolapicโ€), maka tampaknya Anda mengetikkan huruf tambahan.

Jadi, apa yang akan terjadi dari opsi "noapic pci = nomsi":



Output dari / proc / interupsi:

  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 

Tabel perutean interupsi dan opsi "acpi = noirq", "pci = noacpi", "acpi = off"


Bagaimana sistem operasi menerima informasi perutean interupsi dari perangkat? BIOS menyiapkan informasi untuk OS dalam bentuk:

  • Tabel ACPI (metode _PIC / _PRT)
  • Tabel _MP_ (MPtable)
  • $ PIR tabel
  • Mendaftarkan ruang konfigurasi perangkat PCI 0x3C / 0x3D

Perlu dicatat bahwa BIOS tidak perlu melakukan apa pun ekstra untuk menunjukkan gangguan pada MSI, semua informasi di atas hanya diperlukan untuk jalur interupsi APIC / PIC.

Tabel dalam daftar di atas ditunjukkan sesuai urutan prioritas. Mari kita pertimbangkan lebih terinci.

Misalkan BIOS memberikan semua data ini dan kami boot tanpa opsi tambahan:

  • OS menemukan tabel ACPI
  • OS menjalankan metode ACPI "_PIC", memberikan argumen bahwa ia perlu dimuat dalam mode APIC. Di sini kode metode biasanya menyimpan mode yang dipilih dalam variabel (katakanlah PICM = 1)
  • Untuk mendapatkan data tentang interupsi, OS memanggil metode ACPI "_PRT". Ia memeriksa variabel PICM secara internal dan mengembalikan perutean untuk kasus APIC

Jika kita boot dengan opsi noapic :

  • OS menemukan tabel ACPI
  • OS mengeksekusi metode ACPI "_PIC", memberikan argumen bahwa perlu boot dalam mode PIC. Di sini kode metode biasanya menyimpan mode yang dipilih dalam suatu variabel (katakanlah PICM = 0)
  • Untuk mendapatkan data tentang interupsi, OS memanggil metode ACPI "_PRT". Ini memeriksa variabel PICM secara internal dan mengembalikan routing untuk kasus PIC

Jika tabel ACPI hilang atau fungsi perutean interupsi melalui ACPI dinonaktifkan menggunakan opsi acpi = noirq atau pci = noacpi (atau ACPI sepenuhnya dimatikan menggunakan acpi = off ), maka OS mencari tabel MPtable (_MP_) untuk perutean rute:

  • OS tidak menemukan / tidak melihat tabel ACPI
  • OS menemukan MPtable (_MP_)

Jika tabel ACPI hilang atau fungsi perutean interupsi melalui ACPI dinonaktifkan menggunakan opsi acpi = noirq atau pci = noacpi (atau ACPI sepenuhnya dimatikan menggunakan acpi = off ) dan jika tabel MPtable (_MP_) hilang (atau opsi boot noapic atau nolapic dilewatkan ):

  • OS tidak menemukan / melihat tabel ACPI
  • OS tidak menemukan / tidak melihat tabel MPtable (_MP_)
  • OS menemukan tabel $ PIR

Jika tidak ada tabel $ PIR, atau tidak lengkap, maka sistem operasi untuk menebak gangguan akan melihat nilai-nilai register 0x3C / 0x3D dalam ruang konfigurasi perangkat PCI.

Kami merangkum semua hal di atas dengan gambar berikut:



Harus diingat bahwa tidak setiap BIOS menyediakan semua 3 tabel (ACPI / MPtable / $ PIR), jadi jika Anda melewatkan opsi ke loader untuk menolak menggunakan ACPI atau ACPI dan MPtable untuk perutean interupsi, itu jauh dari kenyataan bahwa sistem Anda akan boot.

Catatan 1 : jika kita mencoba untuk boot dalam mode APIC dengan opsi acpi = noirq dan tanpa kehadiran MPtable, maka gambar interupsi akan sama seperti dalam kasus boot normal dengan hanya opsi noapic. Sistem operasi itu sendiri akan masuk ke mode interupsi PIC.
Jika kita mencoba mem-boot tanpa ACPI tables (acpi = off) dan tanpa memberikan MPtable, maka gambarnya akan seperti ini:
  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 

Ini terjadi karena tanpa ACPI dari tabel MADT ( Tabel Deskripsi Multiple APIC ) dan informasi yang diperlukan dari MPtable, sistem operasi tidak mengetahui pengidentifikasi APIC (ID APIC) untuk prosesor lain dan tidak dapat bekerja dengan mereka, tetapi LAPIC dari prosesor utama berfungsi. karena kami tidak melarang ini, dan interupsi MSI dapat melakukannya. Yaitu, akan seperti ini:



Catatan 2 : secara umum, interrupt routing ketika menggunakan ACPI dalam kasus APIC sama dengan interrupt routing via MPtable. Dan perutean interupsi ACPI dalam kasus PIC sama dengan perutean interupsi melalui $ PIR. Jadi kesimpulan dari / proc / interupsi seharusnya tidak berbeda. Namun, dalam proses penelitian, saya memperhatikan satu hal aneh. Ketika merutekan melalui MPtable, untuk beberapa alasan, output berisi cascade interrupt "XT-PIC-XT-PIC cascade".

  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 ... 

Agak aneh bahwa ini terjadi, tetapi dokumentasi kernel tampaknya mengatakan bahwa ini normal.

Kesimpulan:


Sebagai kesimpulan, kami sekali lagi menunjukkan opsi yang diuraikan.

Opsi Pilihan Pengendali Interupsi:

  • pci = nomsi - MSI interupsi akan menjadi IO-APIC / XT-PIC tergantung pada interrupt controller yang digunakan
  • noapic - Menonaktifkan I / O APIC. MSI interupsi masih dapat pergi ke semua CPU, interupsi lain dari perangkat hanya dapat pergi ke PIC, dan hanya bekerja dengan CPU0. Tetapi LAPIC berfungsi dan CPU lainnya dapat bekerja dan menangani interupsi
  • noapic pci = nomsi - Semua interupsi dari perangkat hanya dapat pergi ke PIC, dan hanya bekerja dengan CPU0. Tetapi LAPIC berfungsi dan CPU lainnya dapat bekerja dan menangani interupsi
  • nolapic - Menonaktifkan LAPIC. MSI interupsi tidak dapat bekerja tanpa LAPIC, I / O APIC tidak dapat bekerja tanpa LAPIC. Semua interupsi dari perangkat akan menuju ke PIC, dan hanya bekerja dengan CPU0. Dan tanpa LAPIC, sisa CPU tidak akan berfungsi.

Opsi untuk memilih tabel prioritas untuk perutean interupsi:

  • tidak ada opsi - merutekan melalui APIC menggunakan tabel ACPI
  • noapic - routing melalui PIC menggunakan tabel ACPI
  • acpi = noirq ( pci = noacpi / acpi = off ) - routing melalui APIC menggunakan MPtable
  • acpi = noirq ( pci = noacpi / acpi = off ) noapic ( nolapic ) - routing melalui PIC menggunakan tabel $ PIR

Pada bagian selanjutnya, kita akan melihat bagaimana coreboot mengkonfigurasi chipset untuk interupsi routing.

Source: https://habr.com/ru/post/id431372/


All Articles