هذه تجربة صغيرة أعمل عليها حيث أحاول إنشاء Kernel OS في لغة برمجة GO.
الهدف هو عدم إنشاء نظام تشغيل وظيفي "بالكامل" (مهما كان هذا) ولكن تعرف على المزيد حول أنظمة التشغيل وكيفية صنعها.
في الأصل ، خططت لتنفيذ نظام FAT32. لقد قمت بتطبيق واحد مرة واحدة (في C) ولكن لا يمكنني الاستمرار في العمل في المشروع بسبب مفقود Harware. بالطبع يمكنك بسهولة تنفيذ نظام ملفات في Linux ، ولكن هذا ممل نوعًا ما.
لذا بدلاً من ذلك ، بدأت في كتابة نظام التشغيل الخاص بي لهذا المشروع. إنها أيضًا طريقة لبدء التعلم. حسنا ، على الأقل إلى حد ما.
عندما حصلت على فكرة كتابة نظام تشغيل ، كنت أعلم أنني لا أريد استخدام C ، حيث كان لدي بالفعل بعض الخبرة في كتابة نظام التشغيل في C. لقد تداولت ما إذا كنت سأستخدم الصدأ أو الذهاب إلى كتابة نظام التشغيل الخاص بي. كان العامل الحاسم في النهاية هو أن GO سيكون التحدي الأكبر.
الآن ، قد تعتقد أنه ليس من الجيد استخدام فكرة الذهاب إلى كتابة نواة ، وستكون على حق. تم تصميم Go-Runtime لاستخدامه في مساحة المستخدمين لنظام التشغيل. هناك الكثير من الافتراضات التي يعنيها ذلك ، مثل القدرة على استدعاء Syscalls واستخدام تخصيص الذاكرة الديناميكية. في نواة لا يمكنك الاعتماد على نظام التشغيل للتعامل مع هذا لك ، كما أنت نظام التشغيل. ومع ذلك ، مع برمجة دقيقة والتخلي عن بعض الميزات الذهاب يمكنك القيام بذلك ، فلماذا لا؟ إنه تحد.
أحد أهداف هذا المشروع هو تحقيق الأشياء بسرعة ، لذلك لم أقضي وقتًا في تصميم نظام التشغيل. لتسريع العملية برمتها ، قررت استخدام واجهة Syscall من Linux. وبهذه الطريقة ، لن أضطر إلى كتابة مكتبات مساحة المستخدمين الخاصة بي ويمكنني استخدام أي لغة برمجة أردت في مساحة المستخدمين الخاصة بي. لديها عدد قليل من العيوب على الرغم من. على الرغم من أنني أفعل syscalls بنفس طريقة Linux ، فإن هذا يتطلب مني استخدام جميع افتراضات Linux أيضًا. على سبيل المثال ، من خلال بدء تشغيل عملية إعادة إنشاء مساحة ذاكرة لها بنفس الطريقة التي ستحتاج فيها Linux إلى إرجاع القيم المتوقعة على kernel Linux ويفترض أن تصميم kernel متجانسة.
لست متأكدًا بعد إذا كنت متمسكًا بهذا التصميم. هناك فكرة أخرى لدي وهي كتابة ABI الخاصة بي ولكن أيضًا أكتب مكتبة غلاف Linux-syscall من شأنها أن تعترض Linux Syscalls وترجمتها إلى نظام التشغيل الخاص بي.