تخصيص الذاكرة لمساحة المستخدم من مؤشر ترابط kernel

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

  •  06-07-2019
  •  | 
  •  

سؤال

سؤالي يتعلق بتمرير البيانات من النواة إلى برنامج مساحة المستخدم.أريد تنفيذ استدعاء النظام "get_data(size, char *buff, char **meta_buf)".في هذا الاستدعاء، يتم تخصيص برتقالي بواسطة برنامج مساحة المستخدم ويتم تمرير طوله في وسيطة الحجم.ومع ذلك، meta_buf عبارة عن مخزن مؤقت متغير الطول يتم تخصيصه (في صفحات vm الخاصة ببرنامج مساحة المستخدم) ويتم تعبئته بواسطة kernel.سيقوم برنامج مساحة المستخدم بتحرير هذه المنطقة.

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

  1. كيف أقوم بتخصيص ذاكرة لبرنامج مساحة المستخدم من مؤشر ترابط kernel؟(سأكون ممتنًا لو تمكنت من توجيهي إلى أي استدعاء نظام آخر يقوم بعملية مماثلة - التخصيص في kernel وتحرير مساحة المستخدم)
  2. هل هذه الواجهة صحيحة أم أن هناك طريقة أفضل للقيام بذلك؟
هل كانت مفيدة؟

المحلول

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

  • اطلب من مساحة المستخدمين أن تسأل عن مقدار المساحة التي تحتاجها.تقوم مساحة المستخدم بتخصيص الذاكرة من النواة ثم التقاطها.
  • اجعل صفحات مساحة المستخدم mmap المملوكة لبرنامج التشغيل الخاص بك مباشرة في مساحة العنوان الخاصة به.
  • تعيين حد أعلى لكمية البيانات المطلوبة.مجرد تخصيص هذا القدر.

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

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