1. ما المقصود بالنهيار نظام التشغيل أو انهيار العملية (crash)؟
الموضوع بسيط لكنه أعقد من الي نتصوره ومرتبط بالمعالج ثم نظام التشغيل، رايح أتكلم هنا عن x86 و Linux، كل المعالجات وأنظمة التشغيل تتشابه، فقط اختلاف في التفاصيل الصغيرة ولا مجال لتغطيتها…
الموضوع بسيط لكنه أعقد من الي نتصوره ومرتبط بالمعالج ثم نظام التشغيل، رايح أتكلم هنا عن x86 و Linux، كل المعالجات وأنظمة التشغيل تتشابه، فقط اختلاف في التفاصيل الصغيرة ولا مجال لتغطيتها…
2. أثناء تنفذ المعالج لكود قد يحصل استثناء exception مثل:
• وصول خاطئ للذاكرة، مثل الكتابة لذاكرة للقراءة فقط، أو تنفيذ كود في ذاكرة غير قابلة للتنفيذ، أو الوصول لذاكرة unmapped أو misaligned
• تنفيذ تعليمة خاطئة
• القسمة على الصفر
• استثناءات الـ FPU …
• وصول خاطئ للذاكرة، مثل الكتابة لذاكرة للقراءة فقط، أو تنفيذ كود في ذاكرة غير قابلة للتنفيذ، أو الوصول لذاكرة unmapped أو misaligned
• تنفيذ تعليمة خاطئة
• القسمة على الصفر
• استثناءات الـ FPU …
3. ليست كل الاستثناءات أخطاء، قد تكون فشل في الهاردوير (فشل في الذاكرة، أو اللوحة الأم، أو المعالج كارتفاع حرارته).
بعضها تحصل طبيعياً، مثل الـ page fault عندما تكون الذاكرة swapped، هنا يقوم نظام التشغيل بعمل swap-in لها من القرص الصلب للذاكرة الفيزيائية ويكمل البرنامج تنفيذه…
بعضها تحصل طبيعياً، مثل الـ page fault عندما تكون الذاكرة swapped، هنا يقوم نظام التشغيل بعمل swap-in لها من القرص الصلب للذاكرة الفيزيائية ويكمل البرنامج تنفيذه…
4. الآلية التي يتعامل معها المعالج مع الاستثناءات نفسها التي يستخدمها للمقاطعات interrupts.
معظم المعالجات تستخدم مايسمى عادةً بالـ IVT اختصاراً لـ interrupt vector table، وهو مجرد جدول يضع فيه نظام التشغيل عناوين الدوال التي سيستدعيها المعالج عند حدوث مقاطعة من نوع محدد…
معظم المعالجات تستخدم مايسمى عادةً بالـ IVT اختصاراً لـ interrupt vector table، وهو مجرد جدول يضع فيه نظام التشغيل عناوين الدوال التي سيستدعيها المعالج عند حدوث مقاطعة من نوع محدد…
5. في x86 يسمى ذلك الجدول بالـ IDT اختصار لـ Interrupt Descriptor Table، وهو جدول (مصفوفة) فيها عناوين دوال التعامل مع المقاطعات، يتم إخبار المعالج عن حجم وعنوان جدول الـ IDT باستخدام التعليمة lidt، وهي privileged instruction لا يستطيع المستخدم تنفيذها…
wiki.osdev.org
wiki.osdev.org
6. يقوم نظام التشغيل بتسجيل دوال للتعامل مع كل المقاطعات التي ممكن أن تحدث، ويتعمل معها حسب السياق، لو كانت المقاطعة سببها استثناء من نظام التشغيل أو أحد الـ drivers، قد يستطيع نظام التشغيل التعافي منها، لكن في أغلب الحالات سيعطي رسالة خطأ لأن سلامة نظام التشغيل أصبحت محل شك…
7. لو حصل استثناء أثناء معالجة المقاطعة أو الاستثناء، مثلاً لأن البيانات التي يعتمد عليها تلفت، سيستدعي x86 دالة التعامل مع الاستثناء الثنائي double fault، غالباً ستوقف نظام التشغيل، ولو حصل استثناء فيها سيعتبر استثناء ثلاثي triple fault وسيعمل المعالج hard reset ويعيد التشغيل…
8. المعالج يعطي أكثر من فرصة لنظام التشغيل للتعافي، لأن نظام التشغيل أو البرنامج (في حال كان firmware) قد يشغل شيء حرج.
لكن معظم الاستثناءات سببها عملية مستخدم ولاتؤثر فعلياً على سلامة النظام، أغلب أنظمة التشغيل تختار إنها العملية وتعطي رسالة خطأ، ولا يتأثر فيها باقي النظام …
لكن معظم الاستثناءات سببها عملية مستخدم ولاتؤثر فعلياً على سلامة النظام، أغلب أنظمة التشغيل تختار إنها العملية وتعطي رسالة خطأ، ولا يتأثر فيها باقي النظام …
9. نظام التشغيل قد يعطي العملية أيضاً فرصة، Linux يستخدم آلية الـ signals (يستخدم Windows الـ SEH)، مثلاً سيرسل Linux الـ SIGSEGV signal لأخطاء الذاكرة، يمكنك أن تسجل دالة signal handler باستخدام الدالة signal(2) لتتيح للبرنامج التعافي من الاستثناء…
man7.org
man7.org
10. في حال عدم وجود signal handler، يستدعي Linux الـ default action (موضحه في جدول في الرابط السابق)، مثلاً لو لم يتم تسجل دالة للتعامل مع SIGSEGV سيقوم Linux افتراضياً بإيقاف العملية وتوليد ملف core dump (لو كان مفعل) لإتاحة عمل debugging لبرنامج العملية.
جاري تحميل الاقتراحات...