بخلاف malloc/free هل يحتاج البرنامج إلى نظام التشغيل لتوفير أي شيء آخر؟

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

سؤال

أنا أعمل على تصميم النواة (والتي سأسميها في الواقع "النواة" فقط لتكون مختلفة، ولكنها في الأساس هي نفسها) لنظام التشغيل الذي أعمل عليه.إن تفاصيل نظام التشغيل نفسه ليست ذات صلة إذا لم أتمكن من تشغيل المهام المتعددة وإدارة الذاكرة والأشياء الأساسية الأخرى، لذلك أحتاج إلى العمل على ذلك أولاً.لدي بعض الأسئلة حول تصميم روتين مالوك.

أعتقد أن malloc() إما أن تكون جزءًا من النواة نفسها (أنا أميل نحو ذلك) أو جزءًا من البرنامج، لكن سيتعين علي كتابة تطبيقي الخاص لمكتبة C القياسية أيضًا الطريق، حتى أحصل على كتابة malloc.سؤالي في الواقع بسيط إلى حد ما في هذا الصدد، كيف يمكن لـ C (أو C++) إدارة الكومة الخاصة بها؟

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

ما أحتاج إلى معرفته هو، كيف تتعامل لغة C فعليًا مع الكومة المتوسعة ديناميكيًا بهذه الطريقة؟هل يقوم برنامج C المترجم بإجراء مكالماته الخاصة إلى روتين malloc ويتعامل مع الكومة الخاصة به، أم أنني بحاجة إلى تزويده بمساحة تتوسع تلقائيًا؟وأيضًا، كيف يعرف برنامج C أين تبدأ الكومة؟

أوه، وأنا أعلم أن نفس المفاهيم تنطبق على اللغات الأخرى، ولكن أود أن تكون أي أمثلة في C/C++ لأنني أكثر راحة مع تلك اللغة.لا أود أيضًا أن أقلق بشأن أشياء أخرى مثل المكدس، حيث أعتقد أنني قادر على التعامل مع أشياء مثل هذه بمفردي.

لذا أفترض أن سؤالي الحقيقي هو، بخلاف malloc/free (الذي يتعامل مع الحصول على الصفحات وتحريرها لنفسه، وما إلى ذلك) هل يحتاج البرنامج إلى نظام التشغيل لتوفير أي شيء آخر؟

شكرًا!

يحرر أنا مهتم أكثر بكيفية استخدام لغة C لـ malloc فيما يتعلق بالكومة مقارنة بالعمل الفعلي لروتين malloc نفسه.إذا كان ذلك مفيدًا، فأنا أفعل ذلك على x86، لكن C عبارة عن مترجم متقاطع لذا لا ينبغي أن يكون الأمر مهمًا.^_^

تعديل أكثر:أدرك أنني قد أخلط بين المصطلحات.لقد تعلمت أن "الكومة" هي المكان الذي يخزن فيه البرنامج أشياء مثل المتغيرات العالمية/المحلية.لقد اعتدت على التعامل مع "المكدس" في برمجة التجميع، وأدركت للتو أنني ربما أقصد ذلك بدلاً من ذلك.يُظهر القليل من البحث الذي أجريته من جهتي أن كلمة "الكومة" تُستخدم بشكل أكثر شيوعًا للإشارة إلى إجمالي الذاكرة التي خصصها البرنامج لنفسه، أو إجمالي عدد (وترتيب) صفحات الذاكرة التي يوفرها نظام التشغيل.

لذا، مع أخذ ذلك في الاعتبار، كيف أتعامل مع التوسع المستمر كومة؟(يبدو أن صف نظرية C الخاص بي كان معتدلاً ...معيبة.)

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

المحلول

ويتم تنفيذ malloc عموما في وقت التشغيل C في مساحة المستخدم، والاعتماد على نظام OS محددة يدعو إلى الخريطة في صفحات من الذاكرة الظاهرية. وظيفة malloc وfree هي لإدارة تلك الصفحات من الذاكرة، والتي يتم إصلاحها في الحجم (عادة 4 KB، ولكن أكبر في بعض الأحيان)، وشريحة والزهر لهم في القطع التي يمكن استخدام التطبيقات.

وانظر، على سبيل المثال، GNU LIBC التنفيذ.

لتطبيق أبسط من ذلك بكثير، وتحقق من أنظمة التشغيل MIT الدرجة من الماضي عام. على وجه التحديد، راجع مختبر النهائي صدقة ، ونلقي نظرة على lib/malloc.c. يستخدم هذا الرمز JOS نظام التشغيل وضعت في الصف. الطريقة التي يعمل بها هي أن يقرأ من خلال جداول صفحة (شريطة قراءة فقط من قبل OS)، وتبحث عن نطاقات عناوين افتراضية تفاصيلها. ثم يستخدم sys_page_alloc ويدعو نظام sys_page_unmap إلى الخريطة وصفحات unmap في العملية الحالية.

نصائح أخرى

وهناك عدة طرق لمعالجة هذه المشكلة.

وفي معظم الأحيان برامج C لها malloc بك / وظائفها الحرة. أن أحدا لن يعمل للكائنات صغيرة. في البداية (وبمجرد أن الذاكرة المنهكة) وإدارة الذاكرة يطلب من نظام التشغيل لمزيد من الذاكرة. الأساليب التقليدية للقيام بذلك هي mmap وsbrk على يونكس متغيرات (GlobalAlloc / LocalAlloc على Win32).

وأقترح عليك أن نلقي نظرة على دوغ ليا مخصص الذاكرة ( جوجل: dlmalloc) من مزود الذاكرة (مثل OS) وجهة نظر. أن مخصص من الدرجة الأولى في واحدة جيدة جدا والسنانير لجميع نظام التشغيل الرئيسي. إذا كنت تريد أن تعرف ما يتوقع مخصص عالية الأداء من نظام التشغيل هذا هو رمز هو خيارك الأول.

هل الخلط بين كومة كومة و؟

وأنا أسأل لأن أذكر لكم "قطعة الاتساع الذاكرة" ونطاقها والمتغيرات بالضغط على كومة كما يتم الإعلان عنها. أن الأصوات المؤكد كأنك تتحدث فعلا عن المكدس.

في تطبيقات الإعلانات C الأكثر شيوعا من المتغيرات التلقائي مثل

وكثافة العمليات ط؛

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

وانصح تبحث في "خبير C برمجة" بيتر فان دير ليندن لخلفية عن كيفية عمل برامج C عادة مع مكدس والكومة.

والقراءة الإجبارية: كانوث - فن برمجة الحاسوب، المجلد 1، الفصل 2، القسم 2.5. خلاف ذلك، يمكن أن تقرأ كيرنيغان وريتشي "وC لغة برمجة" لنرى التنفيذ؛ أو، هل يمكن قراءة Plauger "وC مكتبة ستاندرد" لرؤية تنفيذ آخر.

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

واقرأ حول إدارة الذاكرة الظاهرية (الترحيل). انها غاية وحدة المعالجة المركزية محددة، وكل OS تنفذ إدارة VM خصيصا لكل وحدة المعالجة المركزية المدعومة. إذا كنت تكتب نظام التشغيل الخاص بك ل x86 / AMD64، وقراءة الكتيبات الخاصة بكل منها.

وعموما، تتولى المكتبة C تنفيذ malloc، طلب الذاكرة من نظام التشغيل (إما عن طريق mmap مجهول، أو في الأنظمة القديمة، sbrk) عند الضرورة. ذلك الجانب النواة من الأشياء يجب التعامل مع تخصيص صفحات كاملة عبر شيء من هذا القبيل واحدة من تلك الوسائل.

وبعد ذلك الامر متروك malloc لتوزع من الذاكرة بطريقة لا تفتيت الذاكرة أكثر من اللازم. أنا لست جدا <م> الاتحاد الافريقي الأمر الواقع بتفاصيل هذا، على الرغم؛ ومع ذلك، فإن مصطلح <م> الساحة يتبادر إلى الذهن. اذا كان يمكنني مطاردة إشارة، سوف تحديث هذه الوظيفة.

خطر الخطر!!إذا كنت تفكر في محاولة تطوير النواة، فيجب أن تكون على دراية تامة بـ يكلف لمواردك ومدى توافرها المحدود نسبياً...

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

للتأكيد على وجهة نظري هنا، (في stackoverflow.com هيه)، راجع هذا المنشور من مدونة تصحيح NT حول تجاوز سعة مكدس kernel، على وجه التحديد،

· على المنصات المستندة إلى x86 ، مكدس وضع kernel 12 ك.

· على الأنظمة الأساسية المستندة إلى X64 ، مكدس وضع kernel 24 ك.(تشمل المنصات المستندة إلى X64 أنظمة تحتوي على معالجات تستخدم بنية AMD64 والمعالجات باستخدام بنية Intel EM64T).

· على المنصات القائمة على إيتانيوم ، مكدس وضع النواة هو 32 ألف مع 32 ألفمتجر دعم.

هذا حقًا، ليس كثيرًا؛

المشتبه بهم المعتادين


1.استخدام المكدس بحرية.

2.وظائف الاتصال بشكل متكرر.

إذا قرأت المدونة قليلاً، فسوف ترى مدى صعوبة تطوير النواة مع مجموعة فريدة من المشكلات.لم يكن صفك النظري خاطئًا، بل كان ببساطة وبساطة.;)

للانتقال من النظرية -> تطوير النواة لا يقل أهمية عن أ سياق قم بالتبديل قدر الإمكان (ربما احفظ بعض تفاعلات برنامج Hypervisor في المزيج!!).

على أية حال، لا تفترض أبدًا، تحقق من صحة توقعاتك واختبرها.

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