لينكس: أين هو "الحقيقي" معالج خطأ تجزئة؟
-
10-07-2019 - |
سؤال
إذا كنت القراءة / الكتابة / القفز إلى أي عنوان ummapped.
.text
.global _start
_start:
movl $1,%edx
jmp *%edx
وهذا يؤدي إلى خطأ تجزئة.
وأتساءل، ما هو الجزء الفعلي للنظام (النواة) أن اعتراض يقرأ / يكتب إلى عناوين تفاصيلها (كيف؟) ويلقي "وضع المستخدم" إشارة؟
المحلول
وتدفق كل شيء من الجدول أبنية الفخ. وعادة ما تسمى هذه entry.S (تقسيم على إلى x86 بين entry_32 وentry_64.S) ولها ارتباط المجمع أن يقوم عدد من الأمور (اعتمادا على التكوين) قبل أن يتوجه إلى رمز C النواة المناسبة.
وحتى الوصول إلى ذاكرة غير صالح يجب أن تدخل عن طريق إما page_fault أو general_protection وربما ينتهي به force_sig_info قبل أن قائمة الانتظار في نهاية المطاف إلى الفضاء المستخدم في send_signal (نواة / signal.c).
نصائح أخرى
ويتم تنفيذ ذلك للهندسة المعمارية المختلفة. على سبيل المثال، على x86 و يمكنك التحقق من مصدر في:
do_page_fault: linux/arch/x86/mm/fault.c
في رقائق باور ليست "كتاب E" (على سبيل المثال، ورقائق الأخيرة للأنظمة المدمجة)، ويبدأ خطأ تجزئة مع استثناء 0x300 (بيانات) أو 0x400 (للحصول على تعليمات.) تم تعيين علامة وضع المستخدم / مشرف إلى المشرف، يتم تشغيل MMU قبالة، وحدة المعالجة المركزية يقفز لمعالجة 0x300 أو 0x400، مما يتيح التحكم إلى نظام التشغيل.