يقاطع من الأجهزة الخارجية في نظام x86. الجزء 1. تطور وحدات تحكم المقاطعة

في هذه المقالة ، أود النظر في آليات توصيل المقاطعات من الأجهزة الخارجية في نظام x86 ومحاولة الإجابة عن الأسئلة:

  • ما هو الموافقة المسبقة عن علم وما هو؟
  • ما هو APIC وما هو؟ ما هي LAPIC و I / O APIC؟
  • ما هي الاختلافات بين APIC و xAPIC و x2APIC؟
  • ما هو MSI؟ ما هي الاختلافات بين MSI و MSI-X؟
  • كيف ترتبط جداول $ PIR و MPtable و ACPI بهذا؟

إذا كنت مهتمًا بتلقي إجابة على أي من هذه الأسئلة أو إذا كنت ترغب فقط في التعرف على تطور وحدات تحكم المقاطعة في نظام x86 ، فمرحباً بك في القط.

مقدمة


كلنا نعرف ما هو الانقطاع. بالنسبة لأولئك الذين ليسوا ، اقتبس من ويكيبيديا:

مقاطعة (مقاطعة إنجليزية) - إشارة من برنامج أو جهاز يخطر المعالج بحدوث أي حدث يتطلب اهتمامًا فوريًا. يخطر الانقطاع المعالج بحدوث حدث ذو أولوية عالية يتطلب مقاطعة الرمز الحالي الذي ينفذه المعالج. يستجيب المعالج بتعليق نشاطه الحالي ، وحفظ حالته وتنفيذ وظيفة تسمى معالج المقاطعة (أو معالج المقاطعة) الذي يستجيب للحدث ويخدمه ، وبعد ذلك يعيد التحكم إلى التعليمات البرمجية المتقطعة.

وفقًا لمصدر إشارة المقاطعة ، يتم تقسيمها إلى:

  • غير متزامن أو خارجي (أجهزة) - الأحداث التي تنشأ من أجهزة خارجية (مثل الأجهزة الطرفية) ويمكن أن تحدث في أي لحظة عشوائية: إشارة من جهاز ضبط الوقت أو بطاقة الشبكة أو محرك الأقراص أو ضغطات المفاتيح أو حركة الماوس. يتم تفسير حقيقة حدوث مثل هذا المقاطعة في النظام على أنه طلب مقاطعة (IRQ) - تشير الأجهزة إلى أنها تتطلب اهتمامًا من نظام التشغيل ؛
  • أحداث متزامنة أو داخلية في المعالج نفسه نتيجة لانتهاك شروط معينة عند تنفيذ رمز الجهاز: القسمة على صفر أو تجاوز سعة المكدس ، والوصول إلى عناوين ذاكرة غير صالحة أو رمز عملية غير صالح ؛
في هذه المقالة ، أود مناقشة المقاطعات IRQ الخارجية.

لماذا هم بحاجة؟ افترض أننا نريد تنفيذ بعض الإجراءات باستخدام حزمة إدخال لبطاقة الشبكة عند وصولها. لكي لا تسأل بطاقة الشبكة باستمرار "هل لديك حزمة جديدة؟" ولا تضيع موارد المعالج على هذا ؛ يمكنك استخدام المقاطعة IRQ. يتم توصيل خط مقاطعة الجهاز بخط INTR الخاص بالمعالج ، وعندما يتم استقبال الحزمة ، تقوم بطاقة الشبكة "بسحب" هذا الخط. يدرك المعالج أن هناك معلومات عنها ويقرأ الحزمة.

ولكن ماذا لو كان هناك الكثير من الأجهزة؟ لا يمكنك الحصول على ما يكفي من جميع الأجهزة الخارجية لأرجل المعالج.



لحل هذه المشكلة ، توصلوا إلى رقاقة - وحدة تحكم المقاطعة.

الموافقة المسبقة عن علم


( ويكي / osdev )

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



ومع ذلك ، سرعان ما تبين أن 8 خطوط صغيرة ، ومن أجل زيادة عددها ، تم استخدام 2 8259 وحدة تحكم (رئيسية وعبد) متصلة في سلسلة (ثنائية PIC).

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



أنشأت الدائرة نفسها ، وهذا ما يعنيه عندما يتحدثون عن PIC (Programm Interrupt Controller) الآن. في وقت لاحق ، تلقت وحدات التحكم 8259 بعض التحسينات ، وأصبحت تعرف باسم 8259A ، وتم تضمين هذه الدائرة في مجموعة الشرائح. في الوقت الذي كان فيه الناقل الرئيسي لتوصيل الأجهزة الخارجية هو حافلة 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 دوائر دقيقة من خلال منافذ الإدخال / الإخراج:
رقاقةسجلمنفذ I / O
صورة ماجستيرأمر0x0020
صورة ماجستيرالبيانات0x0021
صورة الرقيقأمر0x00A0
صورة الرقيقالبيانات0x00A1

→ يمكن العثور على وثائق الموديل 8259A هنا.

تم استبدال ناقل ISA ناقل PCI. ومن الواضح أن عدد الأجهزة بدأ يتجاوز الرقم 15 ، بالإضافة إلى ذلك ، على عكس ناقل ISA الثابت ، في هذه الحالة ، يمكن إضافة الأجهزة إلى النظام ديناميكيًا. ولكن لحسن الحظ ، يمكن مشاركة مقاطعات الحافلات هذه (أي يمكن توصيل العديد من الأجهزة بنفس خط IRQ). ونتيجة لذلك ، من أجل حل مشكلة نقص خطوط IRQ ، قرروا تجميع المقاطعات من جميع أجهزة PCI في خطوط PIRQ (طلب المقاطعة القابلة للبرمجة).

لنفترض أن لدينا 4 خطوط مقاطعة بحرية على وحدة تحكم PIC و 20 جهاز PCI. نقوم بدمج المقاطعات من 5 أجهزة لكل خط PIRQx وربط خطوط PIRQx بجهاز التحكم. في حالة حدوث مقاطعة على خط PIRQx ، سيتعين على المعالج استجواب جميع الأجهزة المتصلة بهذا الخط لفهم من أين جاءت المقاطعة ، ولكن بشكل عام هذا يحل المشكلة. غالبًا ما يُسمى الجهاز الذي يربط خطوط مقاطعة PCI في خط PIRQ بجهاز توجيه PIR.

في هذه الطريقة ، يجب عليك التأكد من أن خطوط PIRQx غير متصلة بخطوط IRQx التي بدأت فيها مقاطعات ISA بالفعل (حيث سيؤدي ذلك إلى حدوث تعارضات) ، وأن خطوط PIRQx متوازنة (لأن المزيد من الأجهزة التي قمنا بتوصيلها بنفس خط PIRQ ، تحتاج إلى المزيد من الأجهزة ستستجوب المعالج لفهم أي من هذه الأجهزة تسبب في المقاطعة).



ملاحظة : يظهر جهاز PCI -> رسم خرائط PIR بشكل تجريدي في الصورة ، لأنه في الواقع أكثر تعقيدًا إلى حد ما. في الواقع ، يحتوي كل جهاز PCI على 4 خطوط مقاطعة (INTA ، INTB ، INTC ، INTD). يمكن أن يحتوي كل جهاز PCI على ما يصل إلى 8 وظائف ، والآن تحتوي كل وظيفة على مقاطعة INTx واحدة. يتم تحديد INTx التي ستسحبها كل وظيفة من وظائف الجهاز من خلال تكوين مجموعة الشرائح.

في الجوهر ، الدالات هي كتل منطقية منفصلة. على سبيل المثال ، في جهاز PCI واحد قد تكون هناك وظيفة وحدة تحكم Smbus ، وظيفة تحكم SATA ، وظيفة جسر LPC. على جانب نظام التشغيل ، تكون كل وظيفة عبارة عن جهاز منفصل مع مساحة تكوين PCI الخاصة به.

قام BIOS بتمرير المعلومات حول توجيه المقاطعة في PIC إلى BIOS باستخدام جدول $ PIR وعن طريق ملء 3Ch (خط مقاطعة INT_LN (R / W) و 3 d (INT_PN Interrupt Pin (RO)) لمساحة تكوين PCI لكل وظيفة. كانت المواصفات الخاصة بجدول $ PIR سابقًا على موقع Microsoft على الويب ، ولكنها لم تعد موجودة الآن. يمكن فهم محتويات صفوف $ PIR من مواصفات PCI BIOS [4.2.2. احصل على خيارات توجيه مقاطعة PCI] أو اقرأ هنا

ملحمة


( ويكي ، osdev )

عملت الطريقة السابقة حتى ظهرت أنظمة المعالجات المتعددة. والحقيقة هي أن PIC في جهازها يمكن أن ينقل المقاطعات إلى معالج رئيسي واحد فقط. ولكن أود أن يكون الحمل على المعالجات من معالجة المقاطعة متوازناً. كان حل هذه المشكلة هو الواجهة الجديدة APIC (Advanced PIC).

لكل معالج ، تتم إضافة وحدة تحكم LAPIC خاصة (Local APIC) وإضافة وحدة تحكم I / O APIC لتوجيه المقاطعات من الأجهزة. يتم دمج جميع وحدات التحكم هذه في ناقل مشترك يسمى APIC (يتم توصيل الأنظمة الجديدة الآن عبر ناقل نظام قياسي).

عند وصول مقاطعة من جهاز إلى دبوس I / O APIC ، تقوم وحدة التحكم بتوجيه المقاطعة إلى LAPIC لأحد المعالجات. يسمح لك وجود I / O APIC بموازنة توزيع المقاطعات من الأجهزة الخارجية بين المعالجات.

كانت أول شريحة APIC هي 82489DX ، وكانت شريحة منفصلة تجمع بين LAPIC و I / O APIC. لإنشاء نظام من 2 معالجات ، كانت هناك حاجة إلى 3 دوائر دقيقة كهذه. 2 يعمل LAPIC وواحد كـ I / O APIC. في وقت لاحق ، تم تضمين وظيفة LAPIC مباشرة في المعالجات ، وتم تأطير وظيفة I / O APIC في شريحة 82093AA.

يحتوي I / O APIC 82093AA على 24 دبابيس إدخال ، ويمكن أن تدعم بنية APIC حتى 16 وحدة معالجة مركزية. للحفاظ على التوافق مع الأنظمة القديمة ، تم تخصيص 0 ~ 15 مقاطعة لمقاطعات ISA القديمة. وبدأ عرض الانقطاعات من أجهزة PCI على خط IRQ 16-23. الآن أصبح من الممكن عدم التفكير في تعارضات المقاطعة من أجهزة ISA و PCI. أيضًا ، بفضل زيادة عدد خطوط المقاطعة المجانية ، أصبح من الممكن أيضًا زيادة عدد خطوط PIRQx.



تتم برمجة I / O APIC و LAPIC من خلال MMIO. توجد سجلات LAPIC عادةً في 0xFEE00000 ، وتسجيلات I / O APIC عند 0xFE00000. على الرغم من أنه ، من حيث المبدأ ، يمكن إعادة تشكيل كل هذه العناوين.

كما في حالة PIC ، في البداية ، أصبحت الرقائق الفردية لاحقًا جزءًا من مجموعة الشرائح.

في وقت لاحق ، تلقت بنية APIC التحديث وكان الإصدار الجديد يسمى xAPIC (x - موسع). الاحتفاظ بالتوافق مع الإصدارات السابقة. ارتفع عدد وحدات المعالجة المركزية المحتملة في النظام إلى 256.

كانت الجولة التالية من تطوير العمارة تسمى x2APIC . ارتفع عدد وحدات المعالجة المركزية المحتملة في النظام إلى 2 ^ 32. يمكن أن تعمل وحدات التحكم في وضع التوافق مع xAPIC ، أو في وضع x2APIC الجديد ، حيث لا تتم برمجة LAPIC من خلال MMIO ، ولكن من خلال تسجيلات MSR (وهو أسرع بكثير). بناءً على هذا الرابط ، يلزم دعم IOMMU حتى يعمل هذا الوضع.

وتجدر الإشارة إلى أن النظام قد يكون له عدة وحدات تحكم I / O APIC. على سبيل المثال ، واحدة لـ 24 مقاطعة في الجسر الجنوبي ، والأخرى لـ 32 مقاطعة في الشمال. في سياق مقاطعة I / O APIC ، غالبًا ما يُشار إلى المقاطعات باسم GSI (مقاطعة النظام العالمي). لذلك في مثل هذا النظام سيكون GSI 0-55.

هل يوجد LAPIC مدمج في وحدة المعالجة المركزية وأي هندسة يمكن فهمها من خلال إشارات البت في 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 بـ PCI Express ، حيث تقرر ببساطة إزالة خطوط المقاطعة. للحفاظ على التوافق ، تحاكي أنواع معينة من الرسائل إشارات المقاطعة (INTx #). في هذا المخطط ، وقعت الإضافة المنطقية لخطوط المقاطعة ، التي كانت تتم عن طريق التوصيل المادي للأسلاك ، على أكتاف جسور PCI. ومع ذلك ، فإن دعم مقاطعة INTx القديم هو مجرد دعم للتوافق مع الإصدارات السابقة مع ناقل PCI. في الواقع ، اقترحت PCI Express طريقة جديدة لتسليم رسائل المقاطعة - MSI (مقاطعات الرسائل المُشار إليها). في هذه الطريقة ، للإشارة إلى المقاطعة ، يكتب الجهاز ببساطة إلى منطقة MMIO المخصصة للمعالج LAPIC.



في السابق ، تم تخصيص 4 مقاطعات فقط لجهاز PCI واحد (أي لجميع وظائفه) ، ولكن أصبح الآن من الممكن معالجة ما يصل إلى 32 مقاطعة.

في حالة MSI ، لا توجد مشاركة للخطوط ، كل مقاطعة تتوافق مع جهازها.

كما تحل مقاطعات MSI مشكلة أخرى. لنفترض أن الجهاز يجري معاملة كتابة ذاكرة ، ويريد الإبلاغ عن اكتمالها من خلال مقاطعة. ولكن قد تتأخر عملية الكتابة على الناقل أثناء عملية النقل (التي لا يعرف الجهاز عنها على الإطلاق) ، وستصل إشارة المقاطعة قبل المعالج. وبالتالي ، ستستمر وحدة المعالجة المركزية في قراءة البيانات غير الصالحة. إذا تم استخدام MSI ، يتم إرسال المعلومات حول MSI بالإضافة إلى البيانات ، ولن تتمكن ببساطة من القدوم مبكرًا.

وتجدر الإشارة إلى أن مقاطعات MSI لا يمكن أن تعمل بدون LAPIC ، ولكن استخدام MSI يمكن أن يستبدلنا بـ I / O APIC (تبسيط التصميم).

في وقت لاحق ، تلقت هذه الطريقة ملحق MSI-X. الآن يمكن أن يحتوي كل جهاز على ما يصل إلى 2048 مقاطعة. وأصبح من الممكن الإشارة بشكل فردي لكل مقاطعة إلى المعالج الذي يجب تنفيذه. يمكن أن يكون هذا مفيدًا جدًا للأجهزة المحملة بشكل كبير مثل بطاقات الشبكة.

لا توجد جداول BIOS إضافية مطلوبة لدعم MSI. لكن يجب على الجهاز الإبلاغ عن دعم MSI في أحد الإمكانيات في تكوين PCI ، ويجب أن يدعم برنامج تشغيل الجهاز العمل مع MSI.

الخلاصة


في هذه المقالة ، درسنا تطور وحدات تحكم المقاطعة ، وتلقى معلومات نظرية عامة حول تسليم المقاطعات من الأجهزة الخارجية في نظام x86.

في الجزء التالي ، سننظر في كيفية استخدام كل من وحدات التحكم الموصوفة عمليًا في Linux.

المراجع:


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


All Articles