في
الجزء السابق ، درسنا تطور تسليم المقاطعة من الأجهزة في أنظمة x86 (PIC → APIC → MSI) ، ونظرية عامة ، وجميع المصطلحات اللازمة.
في هذا الجزء العملي ، سنلقي نظرة على كيفية التراجع عن استخدام طرق تسليم مقاطعة Linux القديمة ، أي مراعاة خيارات تمهيد kernel:
سننظر أيضًا في الترتيب الذي ينظر فيه نظام التشغيل إلى جداول توجيه المقاطعة (ACPI / MPtable / $ PIR) وما هو تأثيره على إضافة خيارات التمهيد:
- pci = noacpi
- acpi = noirq
- acpi = إيقاف
ربما جربت مجموعات من كل هذه الخيارات عندما لم يعمل الجهاز بسبب مشكلة المقاطعة. دعونا نرى ماذا يفعلون بالضبط وكيف يغيرون ناتج / proc / المقاطعات.
تنزيل بدون خيارات إضافية
سنشاهد المقاطعات في هذه المقالة على لوحة مخصصة مع Intel Haswell i7 مع مجموعة شرائح lynxPoint-LP التي تعمل على تشغيلها.
سنخرج معلومات حول المقاطعات من خلال الأمر
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-edge - مقاطعة حافة لوحدة تحكم I / O APIC
- IO-APIC-fasteoi - مقاطعة مستوى لكل وحدة تحكم APIC I / O
- PCI-MSI-edge - مقاطعة MSI
- XT-PIC-XT-PIC - مقاطعة على وحدة تحكم PIC (انظر لاحقًا)
- العمود الأخير: الجهاز المرتبط بهذا المقاطعة
لذلك ، كما يجب أن يكون في نظام حديث ، يتم استخدامها للأجهزة وبرامج التشغيل التي تدعم مقاطعات MSI / MSI-X. يتم توجيه المقاطعات المتبقية من خلال IIC / APIC.
يمكن رسم مخطط توجيه المقاطعة المبسط على هذا النحو (المسارات النشطة المميزة باللون الأحمر ، والمسارات غير المستخدمة باللون الأسود).

يجب تصنيف دعم جهاز MSI / MSI-X على أنه القدرة المقابلة في مساحة تكوين PCI الخاصة به.
في التأكيد ، نعطي جزءًا صغيرًا من إخراج lspci للأجهزة التي يشار إلى أنها تستخدم MSI / MSI-X. في حالتنا ، هذه وحدة تحكم SATA (مقاطعة ahci) ، وحدتي تحكم إيثرنت (تقاطع eth58 * و eth59 *) ، وحدة تحكم رسومية (i915) و 2 وحدات تحكم 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
كما نرى ، تحتوي هذه الأجهزة على السطر إما "MSI: Enable +" أو "MSI-X: Enable +"
لنبدأ في تدهور النظام. أولاً ، التمهيد باستخدام خيار pci = nomsi.
PCI = نومي
مع هذا الخيار ، ستصبح مقاطعات MSI IO-APIC / XT-PIC اعتمادًا على وحدة تحكم المقاطعة المستخدمة.
في هذه الحالة ، لا تزال لدينا وحدة تحكم مقاطعة APIC ذات الأولوية ، لذلك ستكون الصورة هكذا:

إخراج / proc / مقاطعات:
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)
نظرًا لانخفاض عدد المقاطعات لكل جهاز ، فإن تمكين هذا الخيار يمكن أن يحد بشكل كبير من أداء برنامج التشغيل (وهذا لا يأخذ في الاعتبار حقيقة أنه وفقًا
لتقنية Intel
Reducing Interrupt Interency من خلال استخدام المقاطعات ذات الإشارات للرسائل ، فإن المقاطعات عبر MSI أسرع 3 مرات من خلال IO -APIC وأسرع 5 مرات من خلال الموافقة المسبقة عن علم).
نوبيك
يعطل هذا الخيار I / O APIC. لا يزال بإمكان مقاطعات MSI الانتقال إلى جميع وحدات المعالجة المركزية ، لكن المقاطعات من الأجهزة يمكن أن تذهب فقط إلى CPU0 ، لأن PIC متصل فقط بوحدة المعالجة المركزية 0. لكن LAPIC يعمل ويمكن لوحدات المعالجة المركزية الأخرى العمل ومعالجة المقاطعات.

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 بالكامل.
nolapic
تعطيل LAPIC. لا يمكن أن تعمل مقاطعات MSI بدون LAPIC ، ولا يمكن أن تعمل I / O APIC بدون LAPIC. لذلك ، ستذهب جميع المقاطعات من الأجهزة إلى PIC ، وهي تعمل فقط مع CPU0. وبدون LAPIC لن تعمل وحدات المعالجة المركزية الأخرى حتى في النظام.

إخراج / proc / مقاطعات:
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". يمكن أن تذهب جميع المقاطعات من الأجهزة إلى CPU0 فقط من خلال الموافقة المسبقة عن علم. لكن LAPIC يعمل ويمكن لوحدات المعالجة المركزية الأخرى العمل ومعالجة المقاطعات.
واحد ، لأنه لا يمكنك الجمع بين أي شيء مع "nolapic" ، لأن سيجعل هذا الخيار I / O APIC و MSI غير متوفرة. لذا إذا كنت قد وصفت خيارات التمهيد ذات مرة "noapic nolapic" (أو الخيار الأكثر شيوعًا "acpi = off noapic nolapic") ، فمن الواضح أنك كتبت حروفًا إضافية.
لذا ، ماذا سيحدث من خيارات "noapic pci = nomsi":

إخراج / proc / مقاطعات:
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" ، ويمرر الحجة القائلة بأنه من الضروري التمهيد في وضع الموافقة المسبقة عن علم. هنا عادة ما يحفظ رمز الطريقة الوضع المحدد في متغير (قل PICM = 0)
- للحصول على بيانات حول المقاطعات ، يستدعي نظام التشغيل طريقة ACPI "_PRT". يقوم بفحص متغير PICM داخليًا وإرجاع التوجيه لحالة PIC
إذا كان جدول ACPI مفقودًا أو تم تعطيل وظيفة توجيه المقاطعة من خلال ACPI باستخدام
خيارات acpi = noirq أو
pci = noacpi (أو تم إيقاف تشغيل ACPI تمامًا باستخدام
acpi = إيقاف ) ، فإن نظام التشغيل يبحث عن جدول MPtable (_MP_) لمقاطعات التوجيه:
- نظام التشغيل لا يجد / لا ينظر في جداول ACPI
- يجد نظام التشغيل MPtable (_MP_)
إذا كان جدول ACPI مفقودًا أو تم تعطيل وظيفة توجيه المقاطعة من خلال ACPI باستخدام
خيارات acpi = noirq أو
pci = noacpi (أو تم إيقاف تشغيل ACPI تمامًا باستخدام
acpi = إيقاف ) وإذا كان جدول MPtable (_MP_) مفقودًا (أو تم
تمرير خيار التمهيد
noapic أو
nolapic ):
- نظام التشغيل لا يجد / يرى جدول ACPI
- لا يجد نظام التشغيل / لا ينظر إلى الجدول MPtable (_MP_)
- يجد نظام التشغيل جدول PIR $
إذا لم يكن هناك جدول PIR $ ، أو لم يكتمل بعد ، فسيقوم نظام التشغيل لتخمين المقاطعات بالنظر في قيم التسجيلات 0x3C / 0x3D لمساحة تكوين جهاز PCI.
نلخص كل ما سبق بالصورة التالية:

تجدر الإشارة إلى أن BIOS لا يوفر كل الجداول الثلاثة (ACPI / MPtable / $ PIR) ، لذلك إذا قمت بتمرير الخيار إلى المحمل لرفض استخدام ACPI أو ACPI و MPtable لتوجيه مقاطعات التوجيه ، فإنه بعيد عن حقيقة أن نظامك سيتم التمهيد.
ملاحظة 1 : إذا حاولنا التمهيد في وضع APIC باستخدام خيار acpi = noirq وبدون وجود 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
يحدث هذا لأنه بدون ACPI لجدول MADT (
جدول وصف APIC متعدد ) والمعلومات الضرورية من MPtable ، فإن نظام التشغيل لا يعرف معرفات APIC (معرفات APIC) للمعالجات الأخرى ولا يمكن التعامل معها ، ولكن يعمل LAPIC الخاص بالمعالج الرئيسي. نظرًا لأننا لم نحظر ذلك ، ويمكن أن تأتي مقاطعات MSI إليه. أي أنه سيكون هكذا:
ملاحظة 2 : بشكل عام ، توجيه المقاطعة عند استخدام ACPI في حالة APIC هو نفس توجيه المقاطعة عبر MPtable. وتوجيه مقاطعة 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 - تعطيل IIC / APIC. لا يزال بإمكان مقاطعات MSI الانتقال إلى جميع وحدات المعالجة المركزية ، ولا يمكن أن تصل المقاطعات الأخرى من الأجهزة إلا إلى PIC ، وهي تعمل فقط مع CPU0. لكن LAPIC يعمل ويمكن لوحدات المعالجة المركزية الأخرى العمل ومعالجة المقاطعات
- noapic pci = nomsi - كل المقاطعات من الأجهزة يمكن أن تذهب فقط إلى الموافقة المسبقة عن علم ، وتعمل فقط مع CPU0. لكن LAPIC يعمل ويمكن لوحدات المعالجة المركزية الأخرى العمل ومعالجة المقاطعات
- nolapic - يعطل LAPIC. لا يمكن أن تعمل مقاطعات MSI بدون LAPIC ، ولا يمكن أن تعمل I / O APIC بدون LAPIC. ستذهب جميع المقاطعات من الأجهزة إلى PIC ، وهي تعمل فقط مع CPU0. وبدون LAPIC ، لن تعمل بقية وحدة المعالجة المركزية.
خيارات اختيار جدول الأولوية لتوجيه المقاطعة:
- لا توجد خيارات - التوجيه من خلال APIC باستخدام جداول ACPI
- noapic - التوجيه من خلال الموافقة المسبقة عن علم باستخدام جداول ACPI
- acpi = noirq ( pci = noacpi / acpi = off ) - التوجيه عبر APIC باستخدام MPtable
- acpi = noirq ( pci = noacpi / acpi = off ) noapic ( nolapic ) - التوجيه عبر PIC باستخدام جدول PIR $
في الجزء التالي ، سنرى كيف يقوم نظام التشغيل الأساسي بتكوين مجموعة الشرائح لمقاطعات التوجيه.