هذا هو أول نظام تشغيل قمت بإنشائه. إنه مكتوب بلغتين: C لغة وتجميع.
تم تنشيط هذا المشروع منذ 15 ديسمبر 2017

خطة العمل
محمل التمهيد
مخصص
قطاع التمهيد
المرحلة 2
نكش
نواة
إدارة الذاكرة
تخصيص إطار الصفحة
تخصيص الذاكرة الديناميكية
نظام البناء
اكتب النص إلى VGA
مقاطعة وحدة المعالجة المركزية (IDT ، ISRS ، IRQs ، إلخ)
اقرأ الحرف من لوحة المفاتيح PS/2
اقرأ السلسلة من لوحة المفاتيح PS/2
الذاكرة الافتراضية (الترحيل ، إطارات ، إلخ)
تخصيص إطار الصفحة وإلغاء التخصيص
تخصيص الذاكرة الديناميكية (Liballoc)
مؤقت وحدة المعالجة المركزية
الحصول على معلومات وحدة المعالجة المركزية
الساعة في الوقت الفعلي: حتى نتمكن من معرفة متى يبدأ الفيلم
تتبع كومة kernel
تعدد المهام
عمليات وضع المستخدم
سائق القرص الصلب
سائق القرص المرن
نظام الملفات
واجهة المستخدم الرسومية
يستخدم هذا نظام التشغيل 2 تحميل تمهيد. في حالة أن المرحلة الثانية هي عندما دخلنا الوضع المحمي ودعا kernel.
تحتوي أول 512 بايت من صورتي المرنة على قطاع التمهيد الذي يقوم بالكثير من الأشياء التي لا يمكن أن يفعلها الوضع المحمي . (على سبيل المثال تحميل الأشياء من القرص). ثم يقفز إلى المرحلة الثانية المحملة في 0x7E00 (مباشرة بعد قطاع التمهيد).
تقوم هذه المرحلة بتحميل GDT وتدخل الوضع المحمي ، ثم تقوم بنسخ النواة المحملة بواسطة قطاع التمهيد عند 0x1000 إلى 0x100000 (1 ميجابايت). في القفزة الأخيرة!
يتزايد حجم النواة دائمًا ، لكن لا يمكنني دائمًا زيادة القطاعات لتحميلها. كحل. قررت استخدام اليرقة. يتم تخزين kernel كصورة elf ( kernel.img ) في قرص مضغوط يستخدم ISO 9660 كنظام ملفات. يدعم Grub أيضًا Multiboot ، بحيث يمكن أن يعمل نظام التشغيل الخاص بي مع الآخرين (Windows ، Linux ، إلخ).
دخلنا الوضع المحمي مما يعني أنه لا يمكننا الوصول إلى وظائف BIOS. لذلك ، يحتاج هذا kernel إلى إعادة تنفيذ هذه الوظائف للتحكم في الأجهزة.
الآن ، قمت بإعادة تنفيذ الأجهزة القياسية: الشاشة ولوحة المفاتيح. في مزيد من التطوير. سأقوم بتنفيذ برنامج تشغيل القرص.
يستخدم نظام التشغيل هذا كل من التجزئة والترحيل لتوفير حماية الذاكرة. في جدول الواصف العالمي الخاص بي ، وضعت 5 واصفات قطاع:
شريحة فارغة
قطاع رمز لـ kernel : القطاع الذي ينتمي إليه رمز kernel الخاص بي
قطاع البيانات لـ kernel : الجزء الذي تنتمي إليه متغيرات kernel العالمية
شريحة رمز للمستخدم : حاليًا لا تستخدم
قطاع البيانات للمستخدم : مثل 4
أنا أيضا تمكين الترحيل. الآن ، قمت بتخليص الصفحة الرابعة عن عمد في جدول الصفحة الأولى إلى not-present read-only ، حتى تتمكن من إنشاء خطأ في الصفحة عن طريق تنفيذ إدخال bsod في سطر أوامر نظام التشغيل الخاص بي.

يوفر هذا kernel مخصصًا لإطار الصفحة ، وبالتالي ستكون إدارة الذاكرة أكثر ملاءمة وسأكون أسهل في التعامل مع تعدد المهام.
كما يقترح البرنامج التعليمي لجيمسم ، سأستخدم مجموعة bitset لتحديد ما إذا كان الإطار مجانيًا أم لا.
1: Allocated 0: Free
v v
frame_bitset: 11110111110101111101111111
^
get_free_frame()
لقد قمت حاليًا بتطبيق malloc الموضع بدون مجاني لأن جميع المتغيرات المستخدمة من قبل kernel لا تحتاج أبدًا إلى التحرر حتى يتم إيقاف تشغيلها.
Heap Allocation
-----------------------------------------------
Allocated |
Memory | Free.......until the end of memory
|
-----------------------------------------------
لأنني كسول ، أقوم بتخصيص مخصص لذاكرة الطرف الثالث يسمى liballoc والذي يتطلب فقط وظائف قليلة في نظام التشغيل الخاص بي.
يستخدم هذا المشروع GNU صنع لبناء. لذلك ، فإن طريقة البناء هي كتابة make ، في حالة حدوث أي مشاكل أثناء البناء ، اكتب make dep قبل make . افتح مشكلة إذا كان لا يزال عالقًا.
إذا كنت لا تستخدم Linux أو WSL (نظام Windows الفرعي لـ Linux) ، فستحتاج إلى تنزيل مترجم متقاطع من هنا. ثم تعديل CC و LD في config.mk .