[الشيء الجديد القديم] هل يمكنني استخدام مجموعتي كما أريد؟

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



تُعرّف اصطلاحات بعض (ولكن ليس كل) البنى بالمنطقة الحمراء ، وهي منطقة الذاكرة أسفل مؤشر المكدس ، ولكنها لا تزال صالحة للاستخدام من قبل التطبيق.



بالنسبة لنظام Windows ، يختلف حجم المنطقة الحمراء حسب بنية الجهاز وغالبًا ما يكون صفريًا.


العمارةحجم المنطقة الحمراء
إلى x860 بايت
إلى x640 بايت
إيتانيوم16 بايت *
ألفا أكسب0 بايت
MIPS320 بايت
Powerpc232 بايت **
ARM328 بايت
ARM6416 بايت

* من الجدير بالذكر أن منصة Itanium تجدر الإشارة إلى ميزة: توجد المنطقة الحمراء أعلى مؤشر المكدس ، وليس تحتها.
** في حالة PowerPC ، تعد المنطقة الحمراء من الآثار الجانبية لاتفاقية الاتصال .


تعتبر أي ذاكرة خلف المنطقة الحمراء (أسفل الحزمة) متقلبة ويمكن تغييرها بواسطة نظام التشغيل في أي وقت.


ولكن بجدية ، لماذا يهتم نظام التشغيل بما أقوم به مع مكدس البيانات الخاص بي؟ أعني ، هذا مكدس بلدي ! لا يخبرني نظام التشغيل بما يجب فعله بالذاكرة التي أقوم بتخصيصها من خلال VirtualAlloc . ما الذي يجعل المكدس مختلفًا عن أي ذاكرة أخرى؟


خذ بعين الاعتبار الكود التالي للنظام الأساسي x86 :


  MOV [esp-4], eax ;  eax    MOV ecx, [esp-4] ;     ecx CMP ecx, eax ;  ? JNZ panic ; N:  -  

شرح التعليق لتعليمات JNZ

تنص اتفاقية تشفير التجميع على أن التعليقات الخاصة بتعليمات الفرع يجب أن تصف النتيجة إذا تم إكمال الفرع. في المثال أعلاه ، يطرح تعليمة CMP السؤال "هل هي نفسها؟". ويقفز تعليمة JNZ إذا لم تكن متساوية. وهكذا ، يبدأ التعليق بـ "N:" ، مما يعني أنه سيتم الانتهاء من الانتقال إذا كانت إجابة السؤال السابق هي "لا" ، ويصف باقي التعليق الموقف عند إجراء النقل.


اتفاقية الترميز المجمّع؟

نعم ، لدينا اتفاقية تشفير لتجميع.


هل من الممكن تنفيذ انتقال مشروط؟


نظرًا لعدم وجود منطقة حمراء على x86 ، يمكن الكتابة فوق الذاكرة ذات الإزاحة السالبة بالنسبة لمؤشر المكدس في أي وقت. لذلك ، من أجل الرمز أعلاه ، يكون الانتقال إلى ملصق panic ممكنًا.


يمكن أن يستخدم المصحح الذاكرة خلف المنطقة الحمراء كمكان مناسب لتخزين بياناته. على سبيل المثال ، إذا استخدمت الأمر .call ، فسيقوم مصحح الأخطاء بإجراء مكالمة متداخلة على نفس المكدس وربما يستخدم جزءًا من مساحة المكدس هذه لحفظ السجلات بحيث يمكن استعادتها بعد الرجوع من الوظيفة التي تم استدعاؤها. لذلك ، سيتم تدمير أي بيانات مخزنة خارج المنطقة الحمراء.


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


لنفترض أن الخيط الخاص بك يعمل بفترة زمنية مباشرة بعد حفظ البيانات خلف المنطقة الحمراء. أثناء انتظار مؤشر الترابط لاستئناف التنفيذ ، يأخذ مدير الذاكرة مؤقتًا صفحة فعلية من الشفرة. في النهاية ، يتحكم مؤشر الترابط الخاص بك مرة أخرى ويحاول مدير الذاكرة تبديل صفحة الكود مرة أخرى (صفحة في). أوه لا ، يحدث خطأ I / O أثناء الترحيل! يدفع نظام التشغيل إطار الاستثناء لـ STATUS_IN_PAGE_ERROR على المكدس ، مما يؤدي إلى تلف البيانات التي قمت بحفظها خلف المنطقة الحمراء.


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


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


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

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


All Articles