سؤال

انا اقرأ Windows عبر C/C ++. وأتساءل فقط يمكن تعيين ملف كبير للذاكرة.

عندما نقوم بتنفيذ تطبيق ، يتم تعيين ملف PE عنوان العملية (قسم المستخدم).

في النوافذ 32 بت ، يمكن تحميل ملف كبير (أكبر من 2 جيجابايت) إلى قسم المستخدم؟ أم أنه سيتم فشله؟
إذا كان ذلك ممكنًا ، فهل يساعد ملف الترحيل في التحميل؟

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

المحلول

لن تتمكن من القيام بذلك على نوافذ 32 بت. أي برنامج تشغيل يريد القيام بذلك سيكون على الأقل 3 وحدات تم تحميلها:

  • ntdll.dll
  • kernel32.dll
  • yoursapplication.exe

سيتم تحميل yourapplication.exe بشكل افتراضي على 0x00400000.exe ، على الرغم من أنه يمكنك تغيير هذا العنوان. سيتم تحميل ntdll.dll و kernel32.dll على عناوين التحميل المعتادة في نطاق High 0x7DXX0000.

في Vista وأنظمة التشغيل لاحقًا ، فإن الفقرة أعلاه ليست صحيحة لأن عناوين التحميل عشوائية ، لكن DLLs ستظل موجودة على عنوانها الخاص في أول 2 جيجابايت من الذاكرة.

وبالتالي ، لن يكون لديك مساحة متجاورة كافية في أي مكان لتحميل ملف PE الكبير بشكل استثنائي ، حتى لو قمت بتشغيل Windows مع مفتاح /3GB.

إذا كنت تريد فكرة جيدة عن المكان الذي سيتم تحميل مختلف DLLs ، فاستخدم vmvalidator (مجاني) لتصور مساحة عنوان التطبيق الخاص بك. يعرض لك عرض الذاكرة الظاهرية تمثيلًا رسوميًا (1 بكسل لكل صفحة 4 كيلو بايت) للذاكرة. توضح لك الصفحات ومسافات طرق عرض الفقرة حالة الذاكرة الافتراضية الفعلية لكل صفحة ذاكرة وفقرة الذاكرة.

بالنسبة إلى Windows 64 بت ، قد تكون قادرًا على تحميل ملف PE بسعة 2 جيجابايت 64 بت - يجب أن يكون هناك بالتأكيد مساحة متجاورة للسماح له بالتحميل في الذاكرة. بالنسبة إلى ما إذا كان سيعمل بعد ذلك ، لا يمكنني قوله ، فسيتعين عليك اختباره.

نصائح أخرى

لا ، لا يمكنك - سوف تستنفد مساحة VA الخاصة بك ، بغض النظر عن إعداد ملف الترحيل.

لا أعتقد أن الملف بأكمله قد تم تعيينه ، فقط حتى حجم الصورة القابلة للتنفيذ (كما هو موضح في رأس PE). لذلك يجب أن يكون أرشيف الاستخلاص الذاتي> 2 جيجابايت ممكنًا. سيتعين على الكود استخدام الملف القياسي I/OS لاستخراج بياناته من الجزء الأخير من الملف ، بعد نهاية صورة PE.

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