سؤال

كما هو معروف على نطاق واسع ، فإن البرنامج الذي يعمل تحت نظام التشغيل Windows 32 بت يحتوي فقط على 2 جيجابايت من الذاكرة الظاهرية المتاحة. من المعروف أيضًا أن 2 جيجابايت محجوز كمساحة kernel. ولكن ما هو في الواقع في مساحة kernel؟

أستطيع أن أفهم الاحتياطي اللازم للنواة نفسها ، ولكن لماذا مساحة kernel في VAS من العملية؟ شكرًا.

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

المحلول

احصل على كتاب Windows Internals ، ويصف ذلك بتفاصيل gory. على الرغم من الملخص القصير ، بعض الأشياء الموجودة في مساحة العنوان الافتراضي (KVA):

1) النواة وهال

2) برامج تشغيل الجهاز

3) أكوام وضع kernel (تسمى التجمعات التنفيذية ، والتي أجدها دائمًا مسلية)

4) الكائنات التي تم تصديرها إلى وضع المستخدم عبر المقابض (العملية ، الخيط ، الحدث ، mutex ، إلخ. الكائنات)

5) نظام PTEs ، الذي يخطط لجميع أنواع الأشياء المثيرة للاهتمام بعيدًا عن تطبيقات وضع المستخدم Grubby (على سبيل المثال ، أدوات التنفيذ التي تستخدمها مؤشرات الترابط عند التشغيل في وضع kernel)

6) ذاكرة التخزين المؤقت لنظام الملفات

والقائمة تطول وتطول ... كما قلت ، اقرأ Windows Internals.

-الشاشة

نصائح أخرى

السبب في أن ذاكرة kernel يتم تعيينها في مساحة العنوان الظاهري لكل عملية هو أن يتحول السياق إلى وضع kernel إلى تغيير جداول صفحة العملية. يتم رفع مستوى الامتياز الحالي فقط 0, ، مما يجعل هذه الصفحات على الفور في متناول.

يجب تبديل جداول الصفحة فقط عند تبديل عملية مختلفة. نظرًا لأن هذه عملية باهظة الثمن (على سبيل المثال ، تتطلب تدفق TLB) ، مما يقلل من تواترها هو الفوز.

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

في رأيي ، هناك حقيقة أخرى غير معروفة عن حدود 2 جيجابايت. تعمل العديد من التطبيقات عادة مع الكثير من الحساب المؤشر (وخاصة التطبيقات المكتوبة في C ، C ++ ، ...). في هذه التطبيقات ، من الشائع إضافة إزاحة إلى المؤشرات ، أو حتى لطرح المؤشرات.

إذا كانت مساحة العنوان الافتراضي المتاحة 2 جيجابايت ، فأنت مضمون أن طرح مؤشرتين دائمًا ما بين -2147483647 و +2147483648 (هذه هي الحدود للقيم الموقعة 32 بت).

إذا كانت مساحة عنوانك هي 3 جيجابايت ، فسيكون الفرق المحتمل أكبر من أي قيمة يمكن تمثيلها في قيمة موقعة 32 بت.

إذا كنت تعلم أن التطبيق الخاص بك آمن ، ولا يطرح مؤشرات غير ذات صلة تمامًا (ومصفوفاتك أقل من 2 جيجابايت!) ، فيمكنك إخبار Windows أن تطبيقك يمكن أن يعمل مع مساحة عنوان أكبر من 2 جيجابايت ، عن طريق ضبط علامة Lainser flagdressaware ( أو اضبط هذا باستخدام الأداة المساعدة Editbin).

مع XP (غير متأكد تمامًا من Vista و W7) ، يمكنك التمهيد في وضع حيث يكون "مساحة kernel" 1 جيجابايت فقط ، ويتم ترك 3 جيجابايت في مساحة العنوان الافتراضية للتطبيق. إذا كان تطبيقك هو largeaddressaware ، فستحصل على 3 جيجابايت كاملة. إذا لم يكن كذلك ، فأنت تحصل فقط على 2 جيجابايت.

على النوافذ 64 بت ، فإن تطبيقات LargeadDressaware 32 بت حتى تحصل على 4 جيجابايت ، نظرًا لأن Windows لا يحتاج إلى مساحة عنوان كبيرة في منطقة 32 بت (بعد كل شيء ، إنه نظام تشغيل 64 بت).

يتم ترجمة البرنامج المكتوب بلغة عالية المستوى ، مثل C ++ ، إلى مكالمات OS API ، وتحديداً ، Windows API لنظام التشغيل Windows OS. العديد من API Windows ، مثل CreateFile ، تتحدث بالفعل مع برامج تشغيل وضع kernel. يتم استخدام مساحة kernel في مساحة عنوان العملية لتخصيص موارد kernel لهذه العملية. على سبيل المثال ، تحتوي مكالمات IOCTL على السائق ، التي تم تمريرها بين واجهة برمجة تطبيقات وضع المستخدم وبرنامج التشغيل. يتم تخصيص هذه المخازن المؤقتة في مساحة kernel العملية.

بشكل عام ، تحتوي مساحة kernel على موارد مخصصة بواسطة مكونات وضع النواة نيابة عن هذه العملية.

يبدو أن سؤالك هو "لماذا" لا "ماذا" كما هو موضح في العنوان.

أيضا ، يفترض سؤالك 32 بت. تختلف الإصدارات 64 بت من Windows تمامًا (على سبيل المثال ، تبلغ 8 تيرابايت ، أو 7 تيرابايت على نظام itanium).

أما بالنسبة لـ "لماذا" ، كيف يمكنك تمرير مؤشرات من وظيفة kernel (مثل السائق) غير الواردة في VAS من العملية؟ كتاب جيد للقراءة لمعرفة هذا سيكون Windows Internals.

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