كيف يمكنني تحديد المقاطعات المحددة للجهاز على X86؟

StackOverflow https://stackoverflow.com/questions/773199

  •  13-09-2019
  •  | 
  •  

سؤال

في دليل مطوري البرمجيات Intel، تقول إن ناقلات المقاطعة 32-255 عادة ما يتم تعريف المستخدم لأجهزة IO الخارجية. في نظامي البرمجة، يجب علي تطوير برنامج تشغيل جهاز بسيط. سؤالي هو كيف يمكنني تحديد متجه مقاطعة محددة لاستخدامه في جهاز معين؟ هل تم ذلك مع BIOS؟

ملاحظة: نقوم بتطوير نظام تشغيل بسيط حتى يكون وضعي محددا تماما، ومع ذلك، في النهاية أحتاج إلى فهم كيف يحدث كل ذلك على نظام X86. يتم إعداد نظامنا حاليا بحيث يتم تعيين عدد قليل من ناقلات المقاطعة فوق 32 للأجهزة مثل منفذ تسلسلي ولوحة مفاتيح. في قراءة ورقة البيانات لمراقب ITCH5 ICH5 ICH5 ITTEL 82801EB، على وجه التحديد القسم المتعلق ب 8259 بلدان جزر المحيط الهادئ، تقول إن IRQ15 هي قناة IDE الثانوية. كيف سيتم وضع ذلك في النهاية على المكدس كمتجه المقاطعة؟

قد أكون مشوشا للغاية بأن هذا السؤال لم يكن منطقيا، لذلك أعتذر مقدما.

تحرير: لذلك تحتوي فئة برمجة أنظمةنا على نظام تشغيل بسيط للغاية، والذي يحتوي على إجراءات Kernel لتثبيت ISRS للتعامل مع المقاطعات المحددة بالنظر إلى رقم ناقل. في الفصل الدراسي الخاص بنا، أعطانا الأستاذ ملف رأس يعرف لوحة المفاتيح كرقم ناقلات 0x2c أو شيء مشابه. أحاول معرفة كيفية رسم مقاطعات IDE الأساسية و / أو الثانوية إلى العديد من ISRs باستخدام إجراءات النواة لدينا. في الوقت الحالي، جميع ناقلات المقاطعة غير المستخدمة لديها معالج افتراضي من شأنه أن يطبع الرسائل إذا حدث مقاطعة، لذلك لا تظهر مقاطعات IDE في الوقت الحالي، لكن هذا سؤال آخر.

هل كانت مفيدة؟

المحلول 5

حسنا، يبدو أنني قد وجدت الإجابة في رمز الدعم الخاص بنا، وتحديدا روتين تهيئة الموافقة المسبقة عن علم. مع تعيين خطوط IRQ التعليمات البرمجية التالية عند الإزاحة 20H و 28 ساعة في IDT للماجستير والصور الرقيق، على التوالي.

/* ICW2: master offset of 20 in the IDT, slave offset of 28 */

__outb( PIC_MASTER_IMR_PORT, 0x20 );
__outb( PIC_SLAVE_IMR_PORT, 0x28 );

هذا يعني أنه تم تعيين لوحة المفاتيح إلى ناقل رقم 2C، وسيتم تعيين القنوات الأساسية والثانوية إلى 2E و 2F على التوالي. البعض منكم ربما كان من المحتمل أن يكون لي إجابات أفضل لو سألت عن السؤال أفضل، لكنني أقدر المساعدة على أي حال!

توضح الجدول 45 من ورقة بيانات ICH5 82801EB خطوط IRQ 8259، وفي نظام التشغيل الخاص بي يتم تحميل سيد ببساطة عند الإزاحة 20H والعبد 28 ساعة.

شكرا!

نصائح أخرى

يمكنك برنامج وحدة تحكم المقاطعة (المقاطعة القابلة للبرمجة) لتعيين جهاز معين IRQ.

على X86، هناك اثنين من الموافقة المسبقة عن علم والذي يعطي ديزي بالسلاسل IRQ0-IRQ17. يدار IRQ0-7 من قبل 8259 و IRQ8-15 من 8259 ثانية من 8259. أول إشارات وحدة المعالجة المركزية وهي سيد، مع الإشارة الثانية (العبد) إلى الأول.

خرائط IDT (جدول واصف المقاطعة) المقاطعات إلى عناوين ISR (إجراءات خدمة المقاطعة). يمكن رفع المقاطعات مباشرة باستخدام التعليمات INT (مصائد البرامج).

على سبيل المثال، لرفع المقاطعة 0x80، تنفيذ INT 0x80.

للتعامل مع 0x80، mov [0x80*4], int_80_handler. وبعد على افتراض بنية 32 بت، عنوان int_80_handler يتم الآن تخزين الدالة في موقع 0x80'Th في IDT.

سوف تجد هذه مفيدة:
http://en.wikipedia.org/wiki/intel_8259.
http://en.wikipedia.org/wiki/interrupt_handler.
http://en.wikipedia.org/wiki/intrupt.
http://en.wikipedia.org/wiki/interrupt_descriptor_table.

لقد مر بعض الوقت منذ أن تعاملت مع هذه الأشياء، لذلك قد يتم إيقاف تشغيل ذلك: أتذكر أن وحدة تحكم مقاطعة الكمبيوتر تحتوي على 15 خطوط IRQ. هذه الخريطة إلى ناقلات مقاطعة X86 المحددة المحددة. لذلك عندما يؤدي الطرف المحيطي إلى وضع خط IRQ، يقطع الموافقة المسبقة عن علم وحدة المعالجة المركزية ويحكي ناقلات القفز إليه، كما لو تم تنفيذ تعليمات INT المقابلة. بعض IRQ هجوها إلى أجهزة طرفية معينة، لكنني أعتقد أن أجهزة PCI تفاوض مع نظام التشغيل ل IRQs وبعض الموارد الأخرى (كما تفعل أجهزة ISA PNP ISA).

أنا لا أفهم ما تقصده "كيف سيتم وضع ذلك في نهاية المطاف على المكدس كمتجه المقاطعة؟"

هناك طريقتان ممكنان للجهاز للحصول على مقاطعة:

  1. استخدم آلية التوصيل والتشغيل أو PCI. إذا قمت بذلك، فسوف تتصل BIOS بجهازك المحيطي وطلب متطلبات الموارد. بعد ذلك، يمكن للسائق الخاص بك تعداد أجهزة التوصيل والتشغيل، والبحث عن الجهاز المدعوم والحصول على مقاطعة الأجهزة من الجهاز.

  2. كيف تم القيام به في الأيام الأولى: فقط استخدم مقاطعة واحدة. إضافة مفتاح تراجع إلى الجهاز الذي يسمح للمستخدم بالتحديد بين المقاطعات المختلفة. تخصيص الموارد في يد المستخدمين الآن. سيقوم المستخدم أيضا بتمرير رقم المقاطعة إلى برنامج التشغيل في وقت الحمل بطريقة أو بأخرى.

الآن كيفية ربط المقاطعة: هذا يعتمد على نظام التشغيل والوضع الذي يعمل فيه X86. لنظام عظم عاري، يمكنك الاستعلام عن جدول IDT (جدول واصف المقاطعة) عبر تعليمات خاصة. بمجرد أن يكون لديك هذا IDT يمكنك الحصول على العنوان ووكسم عنوان معالج IRQ في الفتحة الصحيحة. بالنسبة للوضع الحقيقي، لا أعرف كيف انتهيت بعد الآن.

إذا كان لديك ما لا يقل عن القليل من نظام التشغيل في الوقت الفعلي أو أي شيء يشبه نظام التشغيل، فمن المحتمل أن تكون هناك بالفعل وظيفة kernel التي تعمل بشدة لك.

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

في هذه الأيام من الخمر، أنا متأكد من أن هناك أساليب أخرى أكثر ملاءمة، والتي تسمح بمقاطعة تقاسم وكل تلك الأشياء الجيدة.

تحرير: تجاهل الكثير من ذلك، لقد رأيت للتو أنك تبحث في المقاطعة 16 وما فوقها خارج مقاطعات الأجهزة. لقد انتقلت بعيدا عن هذا المستوى من البرمجة قبل أن تكون هناك أجزاء مثيرة للاهتمام من الأجهزة في تلك المساحة، لذا فإنني فقط تعاملت مع أول 15 IRQs (القرص السادس عشر شامل بين وحدات التحكم). سأتركها فقط في حالة حدوث اهتمام أي شخص آخر :)

INT 21H / آه = 25 ساعة - مجموعة ناقلات المقاطعة؛ المدخلات: al = رقم المقاطعة. DS: DX -> معالج المقاطعة الجديد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top