يتحول وحدة المعالجة المركزية من وضع المستخدم إلى وضع kernel: ماذا يفعل بالضبط؟ كيف يجعل هذا الانتقال؟

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

سؤال

وحدة المعالجة المركزية يتحول من وضع المستخدم إلى وضع kernel: ماذا يفعل بالضبط؟ كيف يجعل هذا الانتقال؟

تعديل:

حتى لو كان يعتمد على العمارة ، فيرجى تزويدني بإجابة. العمارة متروك لك. قل لي للهندسة المعمارية التي تعرفها.

أريد أن أحصل على فكرة عما ستشارك فيه كل الأشياء.

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

المحلول

ملاحظة: هذا في الغالب وثيق الصلة بالهندسة المعمارية x86. إليك تفسير مبسط إلى حد ما.

عادة ما يكون الانتقال ناتجًا عن واحد مما يلي:

  • خطأ (مثل خطأ في الصفحة أو استثناء آخر ناتج عن تنفيذ تعليمات)
  • المقاطعة (مثل مقاطعة لوحة المفاتيح أو الانتهاء من الإدخال/الإخراج)
  • فخ (مثل مكالمة النظام)

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

من هذا الجدول ، يمكن لوحدة المعالجة المركزية تحديد معالج المقاطعة للتشغيل.

كجزء من الانتقال ، تسري التغييرات التالية (بشكل عام):

  • قم بالتبديل إلى كومة kernel
  • يتم حفظ eflags
  • يتم حفظ محدد قطاع الكود و EIP.
  • يتم حفظ محدد قطاع المكدس ومؤشر المكدس
  • ابدأ في تنفيذ معالج المقاطعة
  • يتم حفظ سجلات الغرض العام (وظيفة المعالج)
  • يتم تغيير محددات القطاعات إلى kernel Ones (وظيفة معالج)

أنت الآن في وضع kernel.

امل ان يساعد :)

نصائح أخرى

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

ما أفهمه هو أن أي برنامج له سجلات الجزء الذي يحتوي على LSBS Zero سيتم تشغيله في وضع kernel بينما يتم تشغيل أي برنامج يمتلك شريحة LSBS = 1 في وضع المستخدم. في الواقع ، يحدد اثنين من LSBs من المقطع rgeisters مستوى الامتياز (0 أعلى إلى 3 أدنى)

لذلك ، لجعل Prgram تشغيل في وضع kernel ، يجب عليك إعداد سجلات القطاع ليكون 0010 Hex (على ما أظن). لست متأكدًا من كيفية وضع برنامج في مساحة الذاكرة دون الكتابة فوق شيء آخر - وبعبارة أخرى ، كيف يضمن الرابط ذلك؟ أيضًا ، إذا كنت ترغب في الاتصال برمز وضع kernel من رمز وضع المستخدم ، فيجب عليك معرفة كيفية تمرير المعلمات - فهي لا تستخدم نفس SOACE ، لذلك لا يمكنك تمرير البيانات حسب مرجع الذاكرة. أعتقد أنه عليك أن تمررها في السجلات.

إذا كان بإمكان Anynody ملء الفجوات في ما سبق ، فسأكون ممتنًا جدًا.

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

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