عطل الحماية العامة
خطأ الحماية العامة ( GPF ) في معمارية مجموعة تعليمات x86 (ISA) هو خطأ (نوع من المقاطعات ) تُفعَّل بواسطة آليات الحماية المُعرَّفة في معمارية مجموعة التعليمات استجابةً لانتهاك الوصول الناتج عن تنفيذ جزء من التعليمات البرمجية، سواءً في نواة النظام أو في برنامج المستخدم. وُصِفَت هذه الآلية لأول مرة في كتيبات وبيانات معالج Intel 80286 ، الذي طُرِحَ عام 1983؛ كما وُصِفَت أيضًا في القسم 9.8.13 من دليل مبرمج Intel 80386 المرجعي الصادر عام 1986. يُنفَّذ خطأ الحماية العامة كمقاطعة ( رقم المتجه 13 (0Dh)). قد تُصنِّف بعض أنظمة التشغيل بعض الاستثناءات غير المتعلقة بانتهاكات الوصول، مثل استثناءات التعليمات البرمجية غير القانونية ، على أنها أخطاء حماية عامة، حتى وإن لم تكن لها علاقة بحماية الذاكرة. إذا اكتشف المعالج انتهاكًا للحماية، فإنه يُوقف تنفيذ التعليمات البرمجية ويُرسِل مقاطعة خطأ الحماية العامة. في معظم الحالات، يقوم نظام التشغيل بإزالة العملية المعطلة من قائمة التنفيذ، ويُعلم المستخدم، ثم يُواصل تنفيذ العمليات الأخرى. مع ذلك، إذا فشل نظام التشغيل في رصد خطأ الحماية العامة، أي إذا حدث انتهاك آخر للحماية قبل عودة نظام التشغيل من مقاطعة خطأ الحماية العامة السابقة، فإن وحدة المعالجة المركزية تُشير إلى خطأ مزدوج ، مما يُوقف نظام التشغيل. في حال حدوث خطأ آخر ( خطأ ثلاثي )، تعجز وحدة المعالجة المركزية عن التعافي؛ فمنذ معالج 80286، تدخل وحدة المعالجة المركزية في حالة توقف خاصة تُسمى "إيقاف التشغيل"، والتي لا يُمكن الخروج منها إلا من خلال إعادة ضبط الجهاز . يتميز جهاز IBM PC AT ، وهو أول نظام متوافق مع أجهزة الكمبيوتر الشخصية ويحتوي على معالج 80286، بأجهزة ترصد حالة إيقاف التشغيل وتُعيد ضبط وحدة المعالجة المركزية تلقائيًا عند حدوثها. جميع الأجهزة اللاحقة لجهاز PC AT تفعل الشيء نفسه، لذا في أجهزة الكمبيوتر الشخصية، يتسبب الخطأ الثلاثي في إعادة ضبط النظام فورًا.
سلوك محدد
مايكروسوفت ويندوز
في نظام التشغيل مايكروسوفت ويندوز ، يظهر خطأ الحماية العامة بلغات مختلفة، وذلك حسب إصدار المنتج:
| نظام التشغيل | رسائل الخطأ | ملحوظات |
|---|---|---|
| ويندوز 3.0 | خطأ في التطبيق لا يمكن إصلاحه إنهاء التطبيق الحالي. | [ 1 ] |
| ويندوز 3.1x | تسبب [اسم البرنامج] في حدوث خطأ حماية عام في الوحدة [اسم الوحدة] في [عنوان الذاكرة]. | قد تظهر رسالة الخطأ هذه (بنفس تصميمها) في إصدارات لاحقة (95 و98 وMe) في حالات نادرة. كما يظهر نص هذا الخطأ في الإصدارات 95 و98 وMe عند النقر على زر "التفاصيل" أو الضغط على Alt+D، مع إضافة معلومات حول السجلات والبايتات في CS:EIP وتفريغ المكدس. |
| ويندوز 95 ويندوز 98 | لقد قام هذا البرنامج بعملية غير قانونية وسيتم إغلاقه. إذا استمرت المشكلة، فاتصل ببائع البرنامج. | أحيانًا، يظهر خطأ يطلب منك إغلاق جميع البرامج ثم إعادة تشغيل جهاز الكمبيوتر، خاصةً إذا كانت المشكلة خطيرة أو كان النظام غير مستقر، وكان عنوان الإرجاع يشير إلى ملف DLL خاص بنظام ويندوز أو عمليات نظام أخرى. قد تظهر هذه الرسالة أيضًا إذا تعذر تحديد البرنامج المُسبب للمشكلة بسهولة. عند تثبيت مصحح الأخطاء، ستجد زر "تصحيح الأخطاء" بين زري "إغلاق" و"التفاصيل". |
| ويندوز إن تي 4.0 ويندوز 2000 | لقد تسبب [اسم البرنامج] في حدوث أخطاء وسيتم إغلاقه بواسطة نظام التشغيل Windows. ستحتاج إلى إعادة تشغيل البرنامج. يتم إنشاء سجل الأخطاء. | |
| ويندوز مي | تسبب [اسم البرنامج] في حدوث خطأ في [اسم الوحدة]. سيتم إغلاق [اسم البرنامج] الآن. إذا استمرت المشاكل، فحاول إعادة تشغيل جهاز الكمبيوتر الخاص بك. | عند تثبيت برنامج تصحيح الأخطاء، يوجد زر "تصحيح الأخطاء" أسفل زر "إغلاق". ويمكن الاطلاع على التفاصيل بالضغط على Alt+D وعبر ملف faultlog.txt. |
| ويندوز إكس بي، ويندوز سيرفر 2003، ويندوز سيرفر 2003 آر 2 | واجه [اسم البرنامج] مشكلةً ما، ويجب إغلاقه. نأسف للإزعاج. إذا كنت منشغلاً بشيء ما، فقد تضيع المعلومات التي كنت تعمل عليها. [...] للحصول على مزيد من المعلومات حول هذا الخطأ، انقر هنا . | كما توفر رسالة الخطأ خيار إرسال تفاصيل الخطأ إلى مايكروسوفت لتحليلها. |
| ويندوز فيستا والإصدارات الأحدث، باستثناء ويندوز 10 وويندوز سيرفر 2008 والإصدارات الأحدث | [اسم البرنامج] توقف عن العمل. حدث خللٌ ما تسبب في توقف البرنامج عن العمل بشكل صحيح. سيقوم نظام ويندوز بإغلاق البرنامج وإعلامك في حال توفر حل. | بشكل افتراضي، سيرسل نظام التشغيل Windows تفاصيل الخطأ إلى Microsoft لتحليلها، ولكن يمكن تهيئة النظام إما لعدم الإرسال، أو لسؤال المستخدم عما يجب فعله في كل مرة. |
| ويندوز 10 |
لم يعد نظام التشغيل Windows 11 يعرض رسائل خطأ لأخطاء الحماية العامة؛ في حالة حدوث خطأ، يتم إغلاق البرنامج ببساطة.
في أنظمة التشغيل ويندوز 95 و98 وMe، تظهر رسالة خطأ بديلة، تُستخدم غالبًا مع برامج ويندوز 3.x: "حدث خطأ في برنامجك. لمتابعة العمل، انقر فوق "تجاهل" واحفظ عملك في ملف جديد. للخروج من هذا البرنامج، انقر فوق "إغلاق". ستفقد المعلومات التي أدخلتها منذ آخر عملية حفظ." يؤدي النقر فوق "إغلاق" إلى ظهور إحدى رسائل الخطأ المذكورة أعلاه، وذلك حسب إصدار ويندوز. أحيانًا يؤدي النقر فوق "تجاهل" إلى ظهور هذه الرسالة أيضًا.
يونكس
في أنظمة لينكس وغيرها من أنظمة يونكس ، يتم الإبلاغ عن الأخطاء بشكل منفصل (على سبيل المثال، خطأ تجزئة الذاكرة).
أخطاء في الذاكرة
في أخطاء الذاكرة، يصل البرنامج المتسبب بالخطأ إلى ذاكرة لا ينبغي له الوصول إليها. ومن الأمثلة على ذلك:
- محاولة الكتابة إلى جزء من الذاكرة مخصص للقراءة فقط
- محاولة تنفيذ بايتات في الذاكرة غير مصنفة كتعليمات
- محاولة قراءة بايتات البيانات في الذاكرة التي تم تحديدها كتعليمات
- تعارضات أخرى متنوعة بين تسمية جزء من الذاكرة واستخدامه
مع ذلك، تُطبّق العديد من أنظمة التشغيل الحديثة آليات التحكم في الوصول إلى الذاكرة عبر الترحيل بدلاً من التجزئة، لذا غالباً ما يتم الإبلاغ عن مراجع الذاكرة غير الصالحة في أنظمة تشغيل مثل ويندوز عبر أخطاء الصفحات بدلاً من أخطاء الحماية العامة. توفر أنظمة التشغيل عادةً طبقة تجريدية (مثل معالجة الاستثناءات أو الإشارات) تُخفي آلية المعالج الداخلية المستخدمة لإحداث خطأ في الوصول إلى الذاكرة من البرنامج، وذلك بهدف توفير واجهة قياسية للتعامل مع أنواع مختلفة من حالات الخطأ التي يُسببها المعالج.
فيما يتعلق ببنية x86، فإن أخطاء الحماية العامة خاصة بالحماية القائمة على التجزئة عند الوصول إلى الذاكرة. ومع ذلك، تُستخدم أخطاء الحماية العامة أيضًا للإبلاغ عن انتهاكات حماية أخرى (إلى جانب انتهاكات الوصول إلى الذاكرة) عند استخدام الترحيل، مثل استخدام تعليمات غير متاحة من مستوى الامتياز الحالي (CPL).
على الرغم من أنه من الممكن نظرياً أن يستخدم نظام التشغيل كلاً من الترحيل والتجزئة، إلا أن أنظمة التشغيل الشائعة تعتمد في الغالب على الترحيل لتلبية الجزء الأكبر من احتياجاتها للتحكم في الوصول إلى الذاكرة.
أخطاء الامتيازات
توجد بعض الميزات في الحاسوب مخصصة للاستخدام الحصري لنظام التشغيل . إذا حاول برنامج ليس جزءًا من نظام التشغيل استخدام إحدى هذه الميزات، فقد يتسبب ذلك في حدوث خلل في الحماية العامة.
بالإضافة إلى ذلك، توجد مواقع تخزين محجوزة لكل من نظام التشغيل والمعالج نفسه. ونتيجةً لحجزها، فهي للقراءة فقط، وأي محاولة لكتابة بيانات إليها بواسطة برنامج غير مصرح له ستؤدي إلى حدوث خطأ.
الأسباب التقنية للأعطال
يتم رفع أخطاء الحماية العامة بواسطة المعالج عند مواجهة تعليمات محمية تتجاوز مستوى الإذن للمهمة قيد التنفيذ حاليًا، إما لأن برنامجًا في وضع المستخدم يحاول تنفيذ تعليمات محمية، أو لأن نظام التشغيل قد أصدر طلبًا من شأنه أن يضع المعالج في حالة غير محددة.
General protection faults are caught and handled by modern operating systems. Generally, if the fault originated in a user-mode program, the user-mode program is terminated. If, however, the fault originated in a core system driver or the operating system itself, the operating system usually saves diagnostic information either to a file or to the screen and stops operating. It either restarts the computer or displays an error screen, such as a Blue Screen of Death or kernel panic.
Segment limits exceeded
Segment limits can be exceeded:
- with code segment (CS), data segment (DS), or ES, FS, or GS (extra segment) registers; or
- accessing descriptor tables such as the Global Descriptor Table (GDT), the Interrupt descriptor table (IDT) and the Local Descriptor Table (LDT).
Segment permissions violated
Segment permissions can be violated by:
- jumping to non-executable segments
- writing to code segments, or read only segments
- reading execute-only segments
Segments illegally loaded
This can occur when:
- a stack segment (SS) is loaded with a segment selector for a read only, executable, null segment, or segment with descriptor privilege not matching the current privilege in CS
- a code segment (CS) loaded with a segment selector for a data, system, or null segment
- SS, DS, ES, FS, or GS are segments loaded with a segment selector for a system segment
- SS, DS, ES, FS, or GS are segments loaded with a segment selector for an execute-only code segment
- accessing memory using DS, ES, FS, or GS registers, when they contain a null selector
Switching
Faults can occur in the task state segment (TSS) structure when:
- switching to a busy task during a call or jump instruction
- switching to an available task during an interrupt return (IRET) instruction
- using a segment selector on a switch pointing to a TSS descriptor in the LDT
Miscellaneous
Other causes of general protection faults are:
- attempting to access an interrupt/exception handler from virtual 8086 mode when the handler's code segment descriptor privilege level (DPL) is greater than zero
- attempting to write a one into the reserved bits of CR4
- attempting to execute privileged instructions when the current privilege level (CPL) is not zero
- attempting to execute a single instruction with a length greater than 15 bytes (possibly by prepending the instruction with superfluous prefixes)[2]
- writing to a reserved bit in an MSR instruction
- accessing a gate containing a null segment selector
- executing a software interrupt when the CPL is greater than the DPL set for the interrupt gate
- لا يشير محدد المقطع في بوابة الاستدعاء أو المقاطعة أو المصيدة إلى مقطع التعليمات البرمجية
- انتهاك قواعد الامتياز
- تمكين الترحيل مع تعطيل الحماية
- بالرجوع إلى جدول وصف المقاطعة بعد مقاطعة أو استثناء ليس مقاطعة أو مصيدة أو بوابة مهمة
- Legacy SSE : معامل الذاكرة غير محاذٍ لـ 16 بايت.
مراجع
- ↑ "استكشاف أخطاء "خطأ التطبيق غير القابل للاسترداد" في DrWatson وإصلاحها" . الدعم . مايكروسوفت . 27 فبراير 2014.
- ↑ "الصفحة 223" . تم الاطلاع عليها بتاريخ 24-09-2023 .
للمزيد من القراءة
- دليل مطوري برامج معمارية إنتل - المجلد 3: برمجة النظام
- تقنية نظام التشغيل
- أخطاء الحاسوب
