سؤال

أنا أفتقد شيئا عندما يتعلق الأمر بفهم الحاجة إلى highmem لمعالجة أكثر من 1 جيجابايت من ذاكرة الوصول العشوائي. هل يشير شخص ما إلى أين أخطأ؟ شكرا!

ما أعرفه:

  • 1 جيجابايت من الذاكرة الظاهرية للعمليات (منطقة الذاكرة المرتفعة) محفوظة لعمليات Kernel. يمكن لمساحة المستخدم استخدام 3 جيجابايت المتبقية. هذا هو انقسام 3/1.

  • تتميز ميزات ذاكرة Virtual بالذاكرة VM صفحات الذاكرة الظاهرية (المستمرة) إلى الصفحات الفعلية (RAM).

ما لا أعرف:

  • ما هي العمليات التي تستخدم الذاكرة الظاهرية kernel؟ أفترض أن أشياء مثل KMALLOC (...) في Kernel-Space ستستخدم ذاكرة Virtual Kernel.

  • أعتقد أنه يمكن استخدام 4 جيجابايت من ذاكرة الوصول العشوائي بموجب هذا المخطط. لا أحصل على السبب في أن مساحة Virtual Virtual Kernel 1 GB هي العامل المحدد عند معالجة المساحة المادية. هذا هو المكان الذي ينهار فيه فهمي. يرجى تقديم النصيحة.

لقد قرأت هذا (http://kerneltrap.org/node/2450.)، وهو أمر عظيم. لكن هذا لا يعالج سؤالي تماما لترضي.

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

المحلول

السبب في أن الفضاء الافتراضي Kernel هو عامل قصر على الذاكرة الفعلية القابلة للاستخدام هو لأن Kernel يحتاج إلى الوصول إلى جميع الذاكرة الفعلية، والطريقة التي تصل إليها بالذاكرة الفعلية هي عناوين Virtual Kernel. لا تستخدم Kernel إرشادات خاصة تتيح الوصول المباشر إلى مواقع الذاكرة الفعلية - يجب عليها إعداد إدخالات جدول الصفحة لأي نطاقات جسدية ترغب في التحدث إليها.

في مخطط "النمط القديم"، تحدد النواة الأشياء حتى يتم تعيين جداول صفحة كل عملية عناوين افتراضية 0xC0000000 ل 0xFFFFFFFF مباشرة إلى العناوين الفعلية من 0x00000000 ل 0x3FFFFFFF (تم وضع علامة على هذه الصفحات بحيث تكون متاحة فقط في وضع حلقة 0 - Kernel). هذه هي "العناوين الظاهرية النواة". بموجب هذا المخطط، يمكن أن تقرأ النواة مباشرة وتكتب أي موقع ذاكرة مادي دون الحاجة إلى كمان MMU لتغيير التعيينات.

ضمن مخطط HighMEM، فإن تعيينات العناوين الافتراضية للنواة للعناوين الفعلية ليست ثابتة - يتم تعيين أجزاء من الذاكرة الفعلية داخل وخارج مساحة العنوان الظاهري kernel حيث يحتاج kernel إلى الوصول إلى تلك الذاكرة. هذا يسمح باستخدام المزيد من الذاكرة الفعلية، ولكن بتكلفة الاضطرار إلى تغيير التعيينات الظاهرية باستمرار، وهي عملية مكلفة للغاية.

نصائح أخرى

تسمح تعيين 1 غيغابايت إلى Kernel في كل عملية للعمليات للتبديل إلى وضع Kernel دون أداء مفتاح سياق أيضا. ردود على مكالمات النظام مثل read(), mmap() ويمكن معالجة الآخرين بشكل مناسب في مساحة عنوان عملية الاتصال ".

إذا لم تكن المساحة بالنسبة للنواة المحجوزة في كل عملية، فإن التبديل إلى "وضع kernel" بين تنفيذ رمز مساحة المستخدم سيكون أكثر تكلفة، ولا يتمكن من استخدام تعيين العناوين الظاهري عبر الأجهزة MMU (وحدة إدارة الذاكرة) لمكالمات النظام يجري خدمتها.

الأنظمة التي تعمل بنبرة 32 بت أكثر من 1 جيجابايت من الذاكرة الفعلية، يمكنها تعيين مواقع الذاكرة الفعلية في ZONE_HIGHMEM (أعلى تقريبا علامة 1GB)، والتي يمكن أن تتطلب النواة للقفز من خلال الأطواق لبعض العمليات للتفاعل معها. إضافة PAE (ملحق العناوين الفيزيائي)، تمتد هذه المشكلة عن طريق السماح ب 64 جيجابايت من الذاكرة الفعلية، مما يقلل نسبة الذاكرة داخل ذاكرة العنوان الفيزيائي 1GB، إلى المناطق المخصصة ZONE_HIGHMEM.

  1. على سبيل المثال، تستخدم مكالمات النظام مساحة Kernel.
  2. يمكنك الحصول على 64 جيجابايت من ذاكرة الوصول العشوائي الفعلي، ولكن على معالجات منصات 32 بت يمكنها الوصول إلى 4 جيجابايت فقط بسبب المعالجة الافتراضية 32 بت. في الواقع، يمكنك الحصول على 1GB من ذاكرة الوصول العشوائي و 3 جيجابايت من المبادلة والعقل الافتراضي سيجعلها تبدو وكأنها لديك 4GB. في منصات 64 بت من المنصات الظاهرية غير محدود عمليا.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top