لماذا يحتفظ Windows بحجز 1GB (أو 2 غيغابايت) لمساحة عنوان النظام؟

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

سؤال

إنها حقيقة معروفة أن تطبيقات Windows عادة ما تحتوي على مساحة عنوان خاصة 2 جيجابايت على نظام 32 بت. يمكن تمديد هذه المساحة إلى 3GB مع التبديل / 3GB.

يحتفظ نظام التشغيل بحد ذاته بقاء 4 جيجابايت.

سؤالي هو لماذا؟

رمز قيد التشغيل في وضع kernel (رمز برنامج تشغيل الجهاز) لديه مساحة العنوان الخاصة به. لماذا، علاوة على مساحة عنوان 4GB حصرية، لا يزال نظام التشغيل يرغب في حجز 2GB من كل عملية وضع المستخدم؟

اعتقدت أن السبب هو الانتقال بين وضع المستخدم ووضع وضع kernel. على سبيل المثال، دعوة إلى NtWriteFile سيحتاج إلى عنوان لروتين إيفاد Kernel (وبالتالي لماذا احتياطي النظام 2GB في كل تطبيق). ولكن، باستخدام SYSENTER, ، ليس رقم خدمة النظام بما يكفي لرمز وضع kernel لمعرفة الوظيفة / الخدمة التي يتم استدعاءها؟

إذا تمكنت من التوضيح لي لماذا من الأهمية بمكان أن يستغرق نظام التشغيل 2GB (أو 1GB) من كل عملية وضع المستخدم.

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

المحلول

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

syscalls تنطوي على مفاتيح السياق اثنين: المستخدم → kernel، ثم kernel → المستخدم. من أجل تسريع هذا الأمر، من الشائع حجز مساحة العنوان الافتراضية الأولى من أعلى 1 جيجابايت أو 2 جيجابايت لاستخدام kernel. نظرا لأن مساحة العنوان الافتراضية لا تتغير عبر مفاتيح السياق هذه، فلن تكون هناك حاجة إلى تدفق TLB. يتم تمكين هذا من قبل مستخدم / مشرف بت في كل PTE، مما يضمن أن ذاكرة Kernel يمكن الوصول إليها إلا في مساحة Kernelspace؛ ليس لديه حق الوصول حتى لو على الرغم من أن جدول الصفحات هو نفسه.

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

Linux على X86 بدعم مرة واحدة وضع يعرف باسم "4G / 4G انقسام". في هذا الوضع، يحتوي PacePace على حق الوصول الكامل إلى مساحة العنوان الافتراضية 4GB بأكمله، ويحتوي النواة أيضا على مساحة عنوان افتراضية كاملة من 4 جيجابايت. التكلفة، كما ذكر أعلاه، هو ذلك كل يتطلب SYSCALL تدفق TLB، بالإضافة إلى إجراءات أكثر تعقيدا لنسخ البيانات بين ذاكرة المستخدم والنواة. وقد تم قياس هذا لفرض عقوبة أداء بنسبة 30٪.


لقد تغيرت الأوقات منذ طرح هذا السؤال في الأصل والإجابة عليها: أنظمة التشغيل 64 بت الآن أكثر انتشارا. في أنظمة تشغيل الحالية على X86-64، العناوين الافتراضية من 0 إلى 247-11 (0-128TB) مسموح ببرامج المستخدم أثناء وجود النواة بشكل دائم في العناوين الافتراضية من 247×(217-1) إلى 264-1 (أو من -247 إلى -1، إذا كنت تعامل معها كعضات صحيحة موقعة).

ماذا يحدث إذا قمت بتشغيل الملف التنفيذي 32 بت على Windows 64 بت؟ كنت تعتقد أن جميع العناوين الافتراضية من 0 إلى 232 (0-4GB) ستكون متاحة بسهولة، ولكن من أجل تجنب تعريض الأخطاء في البرامج الحالية، لا تزال الملفات التنفيذية 32 بت مقصورة على 0-2 جيجابايت إلا إذا تم إعادة ترجمةها /LARGEADDRESSAWARE. وبعد بالنسبة لأولئك الذين هم، يتمكنوا من الوصول إلى 0-4 جيجابايت. (هذا ليس علم جديدا؛ نفس الشيء المطبق في نواة Windows 32 بت تعمل مع /3GB التبديل، الذي غير المستخدم الافتراضي 2G / 2G مستخدم / kernel سبليت إلى 3G / 1G، على الرغم من أن 3-4 جيجابايت ستظل خارج النطاق.)

ما هي أنواع الأخطاء التي قد يكون هناك؟ كمثال، افترض أنك تنفذ QuickSort ولها مؤشران، a و b مشيرا في البداية وبعد نهاية صفيف. إذا اخترت الوسط كما المحور مع (a+b)/2, ، ستعمل طالما أن كلتا العناوين أقل من 2 جيجا بايت، ولكن إذا كانت كلاهما أعلاه، فسوف تواجه الإضافة تجاوز عدد صحيح، وسوف تكون النتيجة خارج الصفيف. (التعبير الصحيح هو a+(b-a)/2.)

كطائرة Linux جانبا، 32 بت، مع سبليت مستخدمي 3G / 1G الخاص بها الافتراضي، لديها برامج تشغيل تاريخيا مع مكدسها الموجود في نطاق 2-3GB، لذلك من المحتمل أن يتم مسح أي أخطاء برمجة من هذا القبيل بسرعة. يوفر Linux 64 بت برامج 32 بت الوصول إلى 0-4GB.

نصائح أخرى

نوافذ (مثل أي نظام التشغيل) أكثر بكثير من برامج تشغيل Kernel +.

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

لذلك يحتاج أي نظام التشغيل بعض مبلغ مساحة العنوان جانبا. أعتقد أن نظام Linux افتراضيا يمثل 1GB فقط لنظام التشغيل.

السبب في شرح MS استقر على 2 جيجابايت مع ويندوز في بلوق ريموند تشن مرة واحدة. ليس لدي الرابط، ولا أستطيع أن أتذكر التفاصيل، ولكن تم اتخاذ القرار لأن نظام التشغيل Windows NT يستهدف في الأصل معالجات ألفا أيضا، وعلى ألفا، كان هناك سبب وجيه حقا للقيام 50/50 الانقسام. ؛)

لقد كان شيئا ما يجب القيام به بدعم ألفا لمدة 32 عاما بالإضافة إلى رمز 64 بت. :)

رمز قيد التشغيل في وضع Kernel (رمز برنامج تشغيل الجهاز) لديه مساحة العنوان الخاصة به.

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

أعتقد أن أفضل إجابة هي أن مصممي نظام التشغيل شعروا أنه بحلول الوقت الذي سيتعين عليه العناية فيه، فإن الناس يستخدمون نوافذ 64 بت.

ولكن هنا مناقشة أفضل.

جزء من الجواب هو القيام به مع تاريخ بنية المعالجات الدقيقة. إليك بعض ما أعرفه، يمكن للآخرين تقديم المزيد من التفاصيل الحديثة.

يحتوي معالج Intel 8086 على بنية إزاحة القطاع للذاكرة، وإعطاء عناوين الذاكرة 20 بت، وبالتالي الذاكرة الفعلية الإجمالية العنوان الفعلية 1MB.

على عكس المعالجات المنافسة للعصر - مثل Zilog Z80 - كان لدى Intel 8086 واحد فقط عنوان العنوان التي كان عليها استيعاب الذاكرة الإلكترونية ليست فحسب، ولكن جميع التواصل الإدخال / الإخراج مع هذه الأجهزة الطرفية الطفيفة مثل لوحة المفاتيح والمنافذ التسلسلية ومنافذ الطابعة وعروض الفيديو. (للمقارنة، كان لدى Zilog Z80 مساحة عنوان مدخلات / إخراج منفصلة مع Opcodes التجميع المخصص للوصول)

أدت الحاجة إلى السماح للمساحة بمجموعة متزايدة من التوسعات الطرفية إلى القرار الأصلي بقطع مساحة العنوان في الذاكرة الإلكترونية من 0-640 كيلو بايت، و "أشياء أخرى" (المدخلات / الإخراج، ROM، ذاكرة فيديو، إلخ) من 640 ألف إلى 1 ميغابايت

نظرا لأن خط X86 نما وتطوره، وتطور أجهزة الكمبيوتر التي تطورت معها، فقد تم استخدام مخططات مماثلة، تنتهي بتقسيم اليوم 2G / 2G اليوم من مساحة عنوان 4G.

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