تتناول هذه المقالة عملية تسليم المقاطعة من أجهزة خارجية في نظام x86. يحاول الإجابة على أسئلة مثل:
- ما هو الموافقة المسبقة عن علم وما هو؟
- ما هو APIC ولماذا؟ ما هو الغرض من LAPIC و I / O APIC؟
- ما هي الاختلافات بين APIC و xAPIC و x2APIC؟
- ما هو MSI؟ ما هي الاختلافات بين MSI و MSI-X؟
- ما هو دور جداول PIR $ و MPtable و ACPI؟
إذا كنت تريد معرفة إجابة أحد هذه الأسئلة ، أو إذا كنت تريد فقط معرفة تطور وحدة التحكم في المقاطعة ، فيرجى الترحيب.
مقدمة
بالنسبة لأولئك الذين لا يعرفون ماهية المقاطعة ، إليك اقتباس من ويكيبيديا:
في برمجة النظام ، المقاطعة هي إشارة إلى المعالج تنبعث من أجهزة أو برامج تشير إلى حدث يحتاج إلى عناية فورية. تنبه المقاطعة المعالج إلى حالة ذات أولوية عالية تتطلب مقاطعة التعليمات البرمجية الحالية التي ينفذها المعالج. يستجيب المعالج بتعليق أنشطته الحالية ، وحفظ حالته ، وتنفيذ وظيفة تسمى معالج المقاطعة (أو روتين خدمة المقاطعة ، ISR) للتعامل مع الحدث. هذا الانقطاع مؤقت ، وبعد انتهاء معالج المقاطعة ، يستأنف المعالج الأنشطة العادية.
هناك نوعان من المقاطعات: مقاطعات الأجهزة و مقاطعات البرامج (softirqs):
- يتم استخدام مقاطعات الأجهزة بواسطة الأجهزة لإبلاغها بأنها تحتاج إلى عناية من نظام التشغيل. داخليًا ، يتم تطبيق مقاطعات الأجهزة باستخدام إشارات التنبيه الإلكترونية التي يتم إرسالها إلى المعالج من جهاز خارجي ، والذي يعد إما جزءًا من الكمبيوتر نفسه ، مثل وحدة تحكم القرص ، أو طرف خارجي. على سبيل المثال ، يؤدي الضغط على مفتاح ما على لوحة المفاتيح أو تحريك الماوس إلى مقاطعة المقاطعات التي تتسبب في قراءة المعالج لمفتاح ضغط المفاتيح أو الماوس. يشار إلى إجراء بدء مقاطعة الأجهزة على أنه طلب مقاطعة (IRQ).
- تحدث مقاطعة البرنامج إما عن حالة استثنائية في المعالج نفسه ، أو عن إرشادات خاصة في مجموعة التعليمات تؤدي إلى مقاطعة عند تنفيذه. غالباً ما يطلق على الأول فخ أو استثناء ويستخدم للأخطاء أو الأحداث التي تحدث أثناء تنفيذ البرنامج والتي تعتبر استثنائية بما فيه الكفاية بحيث لا يمكن معالجتها داخل البرنامج نفسه. على سبيل المثال ، سيتم طرح استثناء القسمة على صفر إذا أمرت وحدة المنطق الحسابي للمعالج بتقسيم الرقم على صفر لأن هذا الإرشادات خطأ ومستحيل.
هذه المقالة حول الأجهزة / المقاطعات الخارجية IRQ.
ما هو الغرض من المقاطعات؟ على سبيل المثال ، نريد تنفيذ إجراء باستخدام حزمة واردة من بطاقة الشبكة بمجرد وصول الحزمة. إذا كنت لا تريد أن تسأل باستمرار بطاقة الشبكة "هل وصلت الحزمة الخاصة بي؟" وتضيع وقتك المعالج ، يمكنك استخدام المقاطعة الخارجية المقاطعة IRQ. يجب توصيل خط المقاطعة من جهاز بخط INTR من وحدة المعالجة المركزية ، وبعد تلقي كل حزمة ، ستصدر بطاقة الشبكة إشارة عبر هذا الخط. سوف تستشعر وحدة المعالجة المركزية هذه الإشارة وتعرف أن بطاقة الشبكة بها معلومات عنها. فقط بعد ذلك سوف تقرأ وحدة المعالجة المركزية الحزمة الواردة.
ولكن ماذا يجب أن نفعل إذا كان هناك الكثير من الأجهزة الخارجية؟ سيكون من غير المجدي للغاية صنع طن من دبابيس INTR على وحدة المعالجة المركزية لهم جميعًا.

لحل هذه المشكلة ، اخترع شريحة خاصة - وحدة تحكم المقاطعة.
PIC
(
ويكي /
osdev )
أول رقاقة تحكم المقاطعة كانت
إنتل 8259 الموافقة المسبقة عن علم . كان لديه 8 خطوط الإدخال (IRQ0-7) و 1 خط الإخراج (الذي يربط وحدة تحكم المقاطعة مع خط INTR من وحدة المعالجة المركزية). عندما يكون هناك انقطاع من أحد الأجهزة على خطوط الإدخال الخاصة به ، فإن 8259 ستصدر إشارة عبر خط INTR. بعد ذلك ستعلم وحدة المعالجة المركزية أن بعض الأجهزة تحتاج إلى عناية فورية ، وسيسأل المعالج PIC أي من خطوط الإدخال الثمانية (IRQx) كان مصدر هذه المقاطعة. هناك بعض النفقات العامة لهذا الاستطلاع ، ولكن لدينا الآن 8 خطوط مقاطعة بدلاً من 1.

قريبا 8 خطوط لم تكن كافية. لزيادة العدد الإجمالي لخطوط المقاطعة ، تم توصيل جهازي تحكم 8259 (رئيسي وعبدي) في سلسلة (Dual PIC).
تتم معالجة IRQs من 0 إلى 7 باستخدام أول Intel 8259 PIC (رئيسي) ، وتتم معالجة IRQs من 8 إلى 15 باستخدام PIC Intel 8259 (رئيسي) الأول. فقط الرئيسي متصلاً بوحدة المعالجة المركزية ويمكن أن يشير إلى المقاطعات الواردة. إذا كان هناك مقاطعة على الأسطر 8-15 ، فإن PIC (العبد) الثانية سوف تشير حوله إلى المعلم على الخط IRQ2 ، وبعد ذلك سيشير المعلم إلى وحدة المعالجة المركزية. يأخذ هذا المقاطعة المتتالية 1 من الخطوط 16 ، ولكنه يجعل ما مجموعه 15 مقاطعة لجميع الأجهزة الخارجية.

تم اعتماد هذا المخطط من قبل المجتمع ، والآن عندما يتحدث شخص ما عن PIC (Programm Interrupt Controller) ، فإن هذا يعني أن نظام الموافقة المسبقة عن علم المزدوج. بعد مرور بعض الوقت ، تم تحسين وحدات التحكم 8259 وحصلت على اسم جديد: 8259A. مع وحدات التحكم هذه ، تم تضمين نظام DUAL PIC في مجموعة الشرائح. في وقت كان فيه الناقل الرئيسي لاتصال الجهاز الخارجي هو ISA ، كان هذا النظام كافياً. كان من الضروري فقط أن الأجهزة المختلفة لم تتصل بنفس خط IRQ ، نظرًا لأن مقاطعات ISA غير قابلة للمشاركة.
كان تخطيط مقاطعة الجهاز قياسيًا إلى حد كبير:
مثال (من
هنا ):
IRQ 0 - مؤقت النظام
IRQ 1 - وحدة تحكم لوحة المفاتيح
IRQ 2 - تتالي (المقاطعة من وحدة تحكم الرقيق)
IRQ 3 - المنفذ التسلسلي COM2
IRQ 4 - المنفذ التسلسلي COM1
IRQ 5 - المنفذ المتوازي 2 و 3 أو بطاقة الصوت
IRQ 6 - تحكم مرن
IRQ 7 - المنفذ المتوازي 1
IRQ 8 - RTC الموقت
IRQ 9 - ACPI
IRQ 10 - مفتوحة / SCSI / NIC
IRQ 11 - فتح / SCSI / NIC
IRQ 12 - تحكم الماوس
IRQ 13 - معالج مشارك للرياضيات
IRQ 14 - قناة ATA 1
IRQ 15 - قناة ATA 2
يتم إجراء التكوين والعمل مع 8259 من الرقائق باستخدام منافذ الإدخال / الإخراج:
يمكن العثور على الوثائق الكاملة لجهاز 8259A
هنا .
استبدال ناقل PCI لاحقاً ناقل ISA. لسوء الحظ ، بدأ عدد الأجهزة يتجاوز العدد 15. وأيضًا بدلاً من ناقل ISA الثابت ، يمكن إضافة الأجهزة الموجودة في ناقل PCI إلى النظام بشكل حيوي مما قد يؤدي إلى مزيد من المشكلات. لكن لحسن الحظ ، يمكن مشاركة المقاطعات في ناقل PCI ، لذلك من الممكن توصيل العديد من الأجهزة بخط IRQ للمقاطعة. في النهاية ، لحل مشكلة نقص خطوط المقاطعة ، تقرر تجميع المقاطعات من جميع أجهزة PCI إلى خطوط PIRQ (طلب مقاطعة قابل للبرمجة).
على سبيل المثال ، افترض أن لدينا 4 خطوط مقاطعة مجانية على وحدة تحكم PIC و 20 جهازًا PCI. يمكننا دمج المقاطعات من 5 أجهزة في خط PIRQx واحد ، وتوصيل خطوط PIRQx هذه بوحدة التحكم PIC. في هذه الحالة ، إذا كان هناك مقاطعة على أحد خطوط PIRQx ، فسيتعين على المعالج أن يسأل جميع الأجهزة المتصلة بهذا الخط عن المقاطعة لمعرفة من المسؤول عنها ، ولكنه في النهاية يحل المشكلة. غالبًا ما يسمى الجهاز الذي يربط خطوط مقاطعة PCI بخطوط PIRQ بجهاز توجيه PIR.
من خلال هذه الطريقة ، من الضروري التأكد من أن خطوط PIRQx لا تتصل بالخطوط التي تحتوي على مقاطعات ISA (لأن هذا سيؤدي إلى تعارضات) وأن خطوط PIRQx متوازنة (كلما زاد عدد الأجهزة التي نتصل بها بخط واحد ، كلما احتاجت وحدة المعالجة المركزية إلى المزيد من الأجهزة للاستطلاع عندما يحتاج إلى التحقق من الجهاز المسؤول عن المقاطعة).
ملاحظة : في الصورة ، يتم رسم خرائط لجهاز PCI -> PIR بصورة مجردة ، لأنه في الحالة الحقيقية أكثر تعقيدًا. في العالم الحقيقي ، يحتوي كل جهاز PCI على 4 خطوط مقاطعة (INTA و INTB و INTC و INTD) وحتى 8 وظائف ، حيث يمكن لكل وظيفة أن تحتوي على واحد فقط من مقاطعات INTx هذه. يتم تحديد أي خط INTx سيتم استخدامه بواسطة كل وظيفة من خلال تكوين الشرائح.
بحكم طبيعتها هي وظائف منطقية منفصلة. على سبيل المثال ، يمكن أن يحتوي جهاز PCI واحد على وظيفة جهاز تحكم Smbus ووظيفة جهاز تحكم SATA ووظيفة جسر LPC. من وجهة نظر نظام التشغيل (OS) ، كل وظيفة تشبه جهاز منفصل مع مساحة التكوين الخاصة به (تكوين PCI).
يتم إرسال معلومات حول توجيه مقاطعة تحكم PIC إلى نظام التشغيل بواسطة BIOS ، وذلك بمساعدة الجدول $ PIR ومن خلال السجلات 3Ch (INT_LN Interrupt Line (R / W)) و 3 d (INT_PN Interrupt Pin (RO)) من مساحة تكوين PCI لكل وظيفة.
كانت هناك مواصفة لجدول PIR $ مؤخرًا
على موقع Microsoft على الويب ، لكنها غير متاحة حاليًا. من الممكن فهم محتوى الجدول من
مواصفات PCI BIOS [4.2.2. احصل على خيارات توجيه مقاطعة PCI] أو من
هنا (الرابط الأخير باللغة الروسية ، ولكن يمكنك محاولة google "مواصفات جدول توجيه PCI IRQ")
APIC
(
ويكي ،
osdev )
الطريقة الأخيرة عملت حتى وصلت أنظمة متعددة المعالجات. بطبيعتها ، لا يمكن لـ PIC إرسال المقاطعات إلا إلى وحدة المعالجة المركزية واحدة ، وفي نظام متعدد المعالجات ، يتم تحميل وحدات المعالجة المركزية (CPU) بطريقة متوازنة. كان حل هذه المشكلة هو واجهة APIC الجديدة (Advanced PIC).
تمت إضافة وحدة تحكم خاصة تسمى LAPIC (APIC المحلي) لكل معالج ، بالإضافة إلى وحدة تحكم
APIC I / O لتوجيه المقاطعات من الأجهزة الخارجية. يتم دمج كل وحدات التحكم هذه في ناقل عام يحمل اسم APIC (لاحظ أن الأنظمة الحديثة تستخدم ناقل نظام قياسي بدلاً من ناقل APIC منفصل لهذه المهمة).
عند وصول مقاطعة خارجية إلى إدخال APIC للإدخال / الإخراج ، سترسل وحدة التحكم رسالة مقاطعة إلى LAPIC لأحد وحدات المعالجة المركزية للنظام. وبهذه الطريقة ، تساعد وحدة التحكم في الإدخال / الإخراج APIC في موازنة تحميل المقاطعة بين المعالجات.
أول رقاقة APIC كانت
82489DX ، والتي كانت شريحة منفصلة تحتوي على LAPIC و I / O APIC متصلة داخل نفسها. بالنسبة لنظام المعالج المزدوج ، كانت هناك حاجة إلى ثلاث رقائق من هذا القبيل: اثنان ل LAPIC والآخر ل I / O APIC. تم تضمين وظيفة LAPIC لاحقًا مباشرةً في المعالجات ، وتم فصل جزء I / O APIC إلى شريحة 82093AA.
يحتوي I / O APIC
82093AA على 24
إدخالًا ، ويمكن أن تدعم بنية APIC ما يصل إلى 16 وحدة المعالجة المركزية. تم ترك المقاطعات 0-15 لمقاطع ISA القديمة للتوافق مع الأنظمة القديمة ، وكانت المقاطعات 16-23 مخصصة لجميع أجهزة PCI. مع هذا الترسيم ، يمكن بسهولة تجنب كل التعارضات بين مقاطعات ISA و PCI. مع زيادة عدد خطوط المقاطعة المجانية ، أصبح من الممكن أيضًا زيادة عدد خطوط PIRQx.

تتم برمجة I / O APIC و LAPIC بمساعدة MMIO. عادةً ما يتم وضع سجلات LAPIC على العنوان 0xFEE00000 ، ويسجل إدخال / إخراج APIC على العنوان 0xFE0000 ، على الرغم من أنه من الممكن إعادة تكوينها.
كما في حالة الموافقة المسبقة عن علم ، أصبحت شرائح منفصلة في البداية جزءًا من مجموعة الشرائح لاحقًا.
تم تحديث بنية APIC لاحقًا ، وكان اسمه الجديد xAPIC (ممتد x). مع التوافق مع الإصدارات السابقة ، تمت زيادة إجمالي عدد وحدات المعالجة المركزية (CPU) الممكنة في النظام إلى 256.
سميت الخطوة التالية في تطوير الهندسة المعمارية
x2APIC . تمت زيادة عدد وحدات المعالجة المركزية الممكنة في النظام إلى 2 ^ 32. يمكن أن تعمل وحدات التحكم هذه في وضع التوافق مع الإصدارات السابقة باستخدام xAPIC ، أو يمكن أن تعمل في وضع x2APIC الجديد. في هذا الوضع الجديد ، لا تتم برمجة وحدة التحكم في الوضع من خلال MMIO ، ولكن من خلال سجلات MSR (وهي أسرع بكثير). وفقًا
لهذا الارتباط ، يعد دعم IOMMU ضروريًا لهذا الوضع.
تجدر الإشارة إلى أنه من الممكن وجود عدة وحدات تحكم APIC I / O في النظام. على سبيل المثال ، واحد لكل 24 مقاطعة في الجسر الجنوبي والآخر لـ 32 مقاطعة في الجسر الشمالي. في سياق I / O APIC ، تسمى المقاطعات عادة GSI (مقاطعة النظام العالمي). لذلك ، فإن النظام المذكور لديه GSIs 0-55.
كيف يمكننا تحديد ما إذا كانت وحدة المعالجة المركزية تحتوي على LAPIC داخلي وما هي بنية APIC التي يدعمها؟ من الممكن الإجابة على هذه الأسئلة عن طريق فحص علامات البت من CPUID.
لمساعدة نظام التشغيل على اكتشاف LAPIC و I / O APIC ، يجب على BIOS تقديم معلومات عنها إما من خلال MPtable (الطريقة القديمة) أو من خلال جدول ACPI (جدول MADT في هذه الحالة). إلى جانب المعلومات الشائعة ، يجب أن يحتوي كل من MPtable و ACPI (في هذه الحالة جدول DSDT) على معلومات حول توجيه المقاطعة. هذا يعني معلومات حول أي جهاز يستخدم خط المقاطعة (مشابه لجدول PIR $).
يمكنك أن تقرأ عن MPtable في
المواصفات الرسمية. في وقت سابق ، كانت المواصفات موجودة على موقع Intel على الويب ، ولكن في الوقت الحالي لا يمكن العثور عليها إلا في إصدار أرشيف. يمكن العثور على مواصفات ACPI على موقع UEFI (الإصدار الحالي هو
6.2 ). تجدر الإشارة إلى أنه من خلال ACPI ، من الممكن إعلان توجيه المقاطعة للأنظمة التي لا تحتوي على APIC (بدلاً من توفير جدول PIR $ منفصل).
MSI
(
ويكي )
كان البديل الأخير لـ APIC جيدًا ، ولكن ليس بدون سلبيات. جعلت كل خطوط المقاطعة من الأجهزة النظام معقدة للغاية وبالتالي زيادة احتمال الخطأ. جاء ناقل PCI Express ليحل محل ناقل PCI ، والذي سهّل جميع أنظمة المقاطعة تمامًا. ليس لديها خطوط المقاطعة على الإطلاق. بالنسبة لإشارات مقاطعة التوافق مع الإصدارات السابقة (INTx #) ، يتم محاكاتها بنوع منفصل من الرسائل. مع خطوط المقاطعة PCI تم اتصالهم مع الأسلاك المادية. مع خطوط المقاطعة PCI Express ، يكون الاتصال منطقيًا ويتم بواسطة جسور PCI Express. ولكن هذا الدعم من المقاطعات القديمة INTx موجود فقط للتوافق مع الإصدارات السابقة مع ناقل PCI. يقدم PCI Express طريقة جديدة تمامًا لتسليم المقاطعة - MSI (مقاطعات Message Signaled). في هذه الطريقة ، يشير الجهاز إلى المقاطعة ببساطة عن طريق الكتابة إلى مكان خاص في منطقة MMIO من LAPIC لوحدات المعالجة المركزية.

في وقت سابق ، يمكن أن يحتوي جهاز PCI واحد (وهذا يعني جميع وظائفه) على 4 مقاطعات فقط ، ولكن أصبح من الممكن الآن معالجة ما يصل إلى 32 مقاطعة.
في حالة MSI ، لا يوجد تبادل لخطوط المقاطعة: كل مقاطعة تتوافق بشكل طبيعي مع الجهاز الخاص بها.
المقاطعات MSI أيضا حل مشكلة واحدة أخرى. على سبيل المثال ، دعنا نتخيل موقفًا يقوم فيه الجهاز بمعاملات كتابة الذاكرة ، ويريد الإشارة إلى اكتماله خلال المقاطعة. لكن يمكن تأجيل معاملة الكتابة على الحافلة أثناء عملية إرسالها (ولا يمكن للجهاز معرفة ذلك). في هذه الحالة ، ستأتي الإشارة حول المقاطعة إلى وحدة المعالجة المركزية أولاً ، وبالتالي فإن المعالج سوف يقرأ البيانات غير الصالحة بعد. إذا تم استخدام MSI ، يتم إرسال معلومات حول MSI بنفس طريقة رسائل البيانات ، وبالتالي لا يمكن أن تأتي في وقت مبكر.
تجدر الإشارة إلى أن مقاطعات MSI لا يمكن أن تعمل بدون LAPIC ، ولكن يمكن لـ MSI استبدال I / O APIC (واحد من تبسيط التصميم).
بعد مرور بعض الوقت تم توسيع طريقة MSI لتشمل MSI-X. الآن يمكن أن يحتوي كل جهاز على 2048 مقاطعة. من الممكن الآن أيضًا تحديد وحدة المعالجة المركزية التي يجب أن تعالج أي مقاطعة. يمكن أن يكون مفيدًا جدًا للأجهزة عالية التحميل ، مثل بطاقات الشبكة على سبيل المثال.
ليست هناك حاجة لجدول BIOS منفصل لدعم MSI. ولكن يجب أن يشير الجهاز إلى دعم MSI الخاص به من خلال إحدى القدرات الموجودة في مساحة تكوين PCI. أيضًا ، يجب أن يتضمن برنامج تشغيل الجهاز كل الدعم اللازم للعمل مع MSI.
Sonclusion
في هذه المقالة درسنا معلومات حول تطور وحدة التحكم بالمقاطعة ولدينا معرفة نظرية شائعة حول تسليم المقاطعة من أجهزة خارجية في نظام x86.
في الجزء التالي ، سنمارس التدريب ونرى كيفية إشراك كل من وحدات تحكم المقاطعة المذكورة أعلاه في نظام Linux.
في الجزء الثالث ، سننظر في شفرة الأساسية ونرى الإعدادات اللازمة في مجموعة الشرائح لتوجيه المقاطعة الصحيح.
الروابط:
شرائح معترف بها
شكر خاص لجاكوب Garber من مجتمع
coreboot لمساعدتي في ترجمة هذه المقالة.