سؤال

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

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

_outb( PIC_MASTER_CMD_PORT, PIC_EOI );  // this causes (or at least sets off) a triple fault reboot
_outb( PIC_SLAVE_CMD_PORT, PIC_EOI );

دون رؤية بقية النظام، هل من الممكن أن يشرح شخص ما ما قد يحدث هنا؟

ملاحظة: تماما كما تسديدة في الظلام، استبدلت دعوة _outb () مع دعوة أخرى _outb () التي تأكد من أن المقاطعات تمكن من تمكين وحدة تحكم IDE، ومع ذلك، فإن التجمع الناتج قد يكون متطابقا تقريبا. هذا لم يسبب خطأ.

* _outb () عبارة عن مجمع لتعليمات Outb X86.

ما هو خاص جدا حول وظيفتي لإرسال EOI إلى الماجستير الموافقة المسبقة عن علم هي مشكلة؟

أدرك دون رؤية الكود، قد يكون من المستحيل الإجابة، ولكن شكرا للنظر!

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

المحلول

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

أعلم أن هذا لأنني فعلا براءة اختراع سخيفة (أثناء العمل في Dell منذ حوالي 20 عاما) في طريقة للتسبب في إعادة تعيين وحدة المعالجة المركزية دون أجهزة خارجية (تستخدم ليتم ذلك من خلال وحدة التحكم في لوحة المفاتيح):

   MOV ESP,1
   PUSH EAX    ; triple fault and reset!

لا يمكن أن يسبب تعليمات Outb خطأ من تلقاء نفسها. تخميني هو أنك تقوم بإعادة تمكين المقاطعة، ويتم تشغيل المقاطعة بينما يكون هناك خطأ ما في كومةك.

نصائح أخرى

عند إعادة تمكين الموافقة المسبقة عن علم، هل تقوم بذلك باستخدام مجموعة علامة CPU المقاطعة، أو مسح (أي. هل تفعل ذلك في وقت ما بعد CLI Opcode، أو، في وقت ما بعد STI Opcode)؟

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

لذلك أتوقع أنه ليس Opcode الخاص بك يتسبب مباشرة في الخطأ: بدلا من ذلك، ما هو الخطأ هو رمز يعمل كنتيجة للمقاطعة التي يحدث نتيجة لإعادة تمكين الموافقة المسبقة عن علم.

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