نظام التشغيل المستند إلى X86 مصمم من نقطة الصفر لتحسين الغرض
int 64 والتي تطلبت واصفات البوابة لتصعيد الامتيازلبناء نظام التشغيل (على افتراض دول مجلس التعاون الخليجي ، NASM مثبتة) ،
makeللركض تحت QEMU
make qemuلتشغيل (على افتراض bochs ، BOCHS-SDL مثبتة) ،
make runللتشغيل تحت QEMU بدعم تصحيح الأخطاء (GDB)
make qemu_gdb(إرفاق GDB ، الأوامر المطلوبة المتوفرة بالفعل في ملف .gdbinit في أعلى مستوى dir)
تبدأ BIOS المعالج في الوضع الحقيقي 16 بت ، يبدأ GRUB بوضع محمي 32 بت. يتم تزويد صورة kernel elf برأس متعدد القدمين وفقًا لمواصفات اليرق ، إذا وجد Grub هذا الرأس في أول 512 بايت من الصورة ، ثم يقوم بتحميل ELF في موقع 0x100000 ، فإن الذاكرة السفلية تنتمي إلى BIOS ، وغيرها من تعيينات الأجهزة/IO مثل VGA. رمز bootup ، يتم تنفيذه من _start enclude نقطة kernel ، و (ملاحظة BSS تم تهيئتها بالفعل بواسطة GRUB) ،
يخصص مخصصات ذاكرة الإستراتيجية البسيطة first-fit ، الذاكرة من مساحة kernel ، أثناء free أيضًا ، يدير ضغط الكتل المجاورة المجاورة.
بالنسبة إلى UsserPace Malloc/Free ، يتم توفير استدعاء نظام sbrk المستخدم داخليًا لزيادة كسر النظام (إذا لزم الأمر). kernel لا تتطلب إعدادات جدول الصفحة والإرجاع يزيد من حد كسر النظام.
ينقسم هذا إلى تعيين ذاكرة فضاء kernel وملابس ذاكرة مساحة المستخدم. تظل تعيينات مساحة kernel ثابتة وهي جزء من كل مساحة عنوان العملية ، غير مستنسخة فقط ، حيث يجب أن تكون التغييرات من عملية واحدة في مساحة kernel واضحة في عمليات أخرى أيضًا.
تعتمد تعيينات مساحة المستخدم على مكالمة exec ، وكل عملية لها نواة خاصة بها بالإضافة إلى مكدس المستخدم.
أثناء تبديل السياق ، يتم تحميل سجل CR3 مع عنوان قاعدة دليل صفحة العملية الحالية ويؤدي أيضًا إلى إبطال TLB داخليًا (Translation Lookaside Buffer).
يتم تخزين تطبيقات مساحة المستخدم في initramfs ، ويرشئ تنسيق CPIO بتنسيق ELF القياسي. أثناء exec kernel يجد ويحلل صورة ELF ، قم بإعداد جداول صفحتها وفقًا لذلك. تبدأ عملية Init فقط shell ثم يتم تعليقها إلى الأبد.
يعمل المجدول نيابة عن عملية التنفيذ حاليًا ، وخاصة في حالتين ،
قطاعات رمز/بيانات وضع kernel منفصلة عن قطاعات رمز/بيانات وضع المستخدم مع مستويات الامتياز المبرمجة وفقًا لذلك. أثناء العودة من الاستثناء ، تنبثق الأجهزة CS (قطاع الرمز) و SS (قطاع المكدس) من المكدس للعودة إلى مستوى الامتياز السفلي.
نبرمج هذا الإطار المكدس وفقًا لذلك أثناء إنشاء مهمة جديدة ،
/* Task will start in CPL = 3, i.e. user mode */
task -> irqf -> cs = ( SEG_UCODE << 3 ) | DPL_USER ;
task -> irqf -> ds = ( SEG_UDATA << 3 ) | DPL_USER ;
task -> irqf -> eflags = 0x200 ;
task -> irqf -> ss = ( SEG_UDATA << 3 ) | DPL_USER ;لدى X86 Hardware دعمًا مدمجًا لتبديل المهام ، والتبديل بشكل أساسي من مكدس المستخدم إلى مكدس kernel جنبا إلى جنب مع معلمات التجزئة الأخرى. لهذا يحتاج كل مهمة إلى الإعداد باستخدام TSS الخاص بها ، والتي يتم تعديلها أثناء تبديل السياق. لن نستخدم تبديل مهام الأجهزة ، ولكننا سنفعل نفس الشيء في البرنامج نفسه. في أي حال ، نحتاج إلى إعداد TSS على واحد على on-east الذي يحتوي على وضع kernel صالح SS (قطاع المكدس) و ESP (مؤشر المكدس) للمهمة الحالية.
الأسئلة الشائعة العشوائية
لا تتردد في الشوكة وإرسال طلب الدمج