الصفحات الافتراضية المحمية للكتابة ، والقبض على الكتابة

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

سؤال

هل توجد طريقة لالتقاط الكتابة في صفحة محمية للكتابة؟

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

هل هذا يوفر حماية الكتابة على الإطلاق؟ أتذكر أنه يجب أن يرفع segfault ، هل هذا صحيح؟ كيفية التقاط الكتابة في صفحة محمية للكتابة. هل هذه طريقة جيدة لتنفيذ ما أريده وهل هناك طريقة أفضل؟

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

المحلول

نعم ، يمكنك استخدام mprotect.

نعم ، فإن الكتابة إلى الذاكرة المحمية سترفع segfault. يمكنك تثبيت معالج ، على سبيل المثال في C ++:

std::signal(SIGSEGV, my_segv_handler_func);

هذه طريقة معقولة لفعل ما تريد ، على الرغم من أنه يتعين عليك إضافة الكثير من الإدارة الإضافية لجعلها تعمل. على سبيل المثال ، يتم هذا النوع من الكشف عن الكتابة في الأجهزة ، وعلى بنيات x86 ، لديك حجم صفحة 4K. حتى تتمكن من حماية الأشياء 4K في وقت واحد ، محاذاة على حدود 4K - وليس عام "ابدأ في العنوان X و GO N B Bytes". أعتقد أنك إما عليك ذلك

  1. احصل على رسم خرائط للكائنات إلى صفحات بحيث يمكنك تحديد ما إذا كانت الكتابة إلى صفحة هي كتابة إلى كائن محمي معين ، أو
  2. قم بلف malloc الخاص بك الذي يخصص دائمًا على حدود 4K ، مما قد يجبرك على استخدام الحد الأدنى لحجم كتلة 4K

لا أعرف الجزء العلوي من رأسي إذا كانت هناك طريقة أفضل ، لكن يبدو من الممتع اللعب معه. قون

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