سؤال

أواجه مشكلة (ممكنة) مع DDK (إصدار قديم جدًا: 3590) لـ WinXP 32 بت. يحتوي برنامج التشغيل الخاص بي على بعض المتغيرات الثابتة التي لا يتم تعويضها (يجب تعيينها إلى قسم .BSS ، أفترض) وبعض الوظائف في قسم الكود القابل للباحة (المميز بـ #Pragma alloc_page (صفحة ، FUNC)). يتم جمع الرمز القابل للباحة في ملف كائن منفصل. لقد اكتشفت أن الرابط يبدو أنه يعين الإحصائيات والرمز القابل للباحة إلى نفس الصفحة في مساحة عنوان kernel (أي أن المتغير في 0xeffcb0a0 والوظيفة في 0xeffcb600 - تم التحقق منها باستخدام Windbg). يتم استخدام المتغيرات الثابتة في بيئة المقاطعة ، لذلك يجب قفل صفحاتها في الذاكرة. ولكن إذا كانت الصفحة نفسها تحتوي على رمز قابل للتبديل ، فأخشى أن تختفي المتغيرات فجأة. تقارير خريطة الرابط بشكل صحيح أن الكود القابل للبناء في قسم مختلف ("الصفحة") ، ولكن الإزاحة ("RVA+BASE") في منتصف الصفحة التي تحتوي على الإحصائيات.

كيف يمكنني إجبار الرابط/المحمل على تعيين صفحات منفصلة للرمز القابل للبناء؟ هل هناك بعض "#pragma" لإجبار القسم على توفيق؟ أفعل شيئا خاطئا؟

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

PPS: تمت إضافة 4096 "NOP" قبل وبعد وظيفتي ... حسنًا ، إنه يعمل ... لا شيء أفضل من ذلك؟

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

المحلول

ضع الكرات الخاصة بك في قطاع البيانات الخاص بهم:

#pragma data_seg("NONPAGE")
// declare your globals here
#pragma data_seg()

مصدر: رابط MSDN على data_seg

بشكل افتراضي ، سيتم إنشاء القسم الخاص بك باستخدام القراءة/الكتابة ، وليس الأعلام المفرطة.

يمكنك تحديد خيارات قسم إضافية:

#pragma comment(linker, "/section:NONPAGE,ERW")

مصدر: رابط MSDN على /القسم

أو يمكنك وضع خيارات الرابط الخاصة بك في SOURCES ملف:

LINKER_FLAGS = $(LINKER_FLAGS) /SECTION:NONPAGE,ERW

ملاحظة: إذا كنت تقوم ببناء مكتبة ، فاستخدمها LIBRARIAN_FLAGS في حين أن

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