Koraos هو نظام تشغيل مكتوب ومصمم من الصفر. تم تطويره كهواية من قبل مطور المتحمسين.
يحتوي هذا المستودع على رمز لنظام Kora لنظام Kora. إذا كنت ترغب في بناء النظام بأكمله ، انظر إلى مستودع Koraos.
لقد كنت أحاول بناء نواة خاصة بي من بعض الوقت. بعد العديد من إعادة صياغة ، فترات الراحة وإعادة التفكير في إعادة تشغيل واحدة تمامًا بعناية دقيقة للتصميم. كان هدفي دائمًا هو إنشاء برنامج يفعل ما يفترض أن يفعلوه ولا شيء أكثر من ذلك ، الضوء والسريع مع بنية مفصول بشدة.
لا يزال هذا البرنامج عبارة عن جرو شاب ، لكنني آمل في بناء نظام موثوق قريبًا. سوف يوفر جميع ميزات الأساسيات لنظام حديث وسيكون محمولًا على عدة بنيات (الهدف: x86 ، x86_64 ، الذراع).
قابلية التشغيل البيني : عندما أحاول أن أفهم كيف يتم صنع الأشياء ، ولماذا ، أخرج أحيانًا من مواصفات Posix أو UNIX الصارمة. أحاول أن أكون متوافقًا قدر الإمكان - مع كل من NT و UNIX World - لكنني أسمح لنفسي باتخاذ خيارات مختلفة.
إن إنشاء kernel ليس مثل بناء تطبيق منتظم قد تكون هناك حاجة إلى بعض الأعمال الإضافية.
يحتوي المستودع (مثل الآخر من Kora) على مجموعة قريبة من Makefile القياسية. يتوفر البرنامج النصي configure ولكن فقط للبناء من دليل آخر وليس إلزاميًا. يستخدم هذا البرنامج النصي فقط للبحث والاستمرار في خيارات البناء.
هنا قائمة بالأوامر الرئيسية:
make # Build the kernel for the host architecture
make check # Build and run unit-tests
make coverage # Run tests and coppute coverage
make install # Build and update the kernel (not yet)
make install-headers # Copy and erase kernelheaders to $(prefix)/include
# For cross-compile using 'i386-kora-gcc' compiler
make target=i386-pc-kora CROSS=i386-kora- CC=gcc
# Simpler using configure
/path/to/sources/configure --target=i386
make # No need to set target or cross. تذكر أنه بالنسبة إلى kernel ، فإن الأمر دائمًا ما يكون بمثابة تجميع . المأزق الأكثر شيوعًا هو محاولة بناء kernel i386 على مضيف x86_64 .
بشكل افتراضي ، يستخدم بيئة قائما بذاتها ولكن رؤوس المضيف قد تتسبب في بعض المشكلات.
في الحالة أو الأخطاء ، من الأفضل استخدام "مُجسد متقاطع".
ملاحظة : تأكد من تثبيت جميع الحزمة مثل BinuTils و GCC و Make و Git ولكن أيضًا المجمع لبعض الهندسة المعمارية (مثل Nasm for
i386وamd64. للشيكات ، أضف أيضًا Valgrind و LCOV .
هنا أيضًا بعض المتغيرات المقبولة بواسطة Makefile لتكوين تمديد:
VERBOSE=y : أوامر تجميع الطباعةQUIET=y : لا تطبع خطوة تجميع المطوّلCFLAGS : أضف أعلامًا إضافية إلى برنامج التحويل البرمجي CNODEPS=y : لا تتضمن *.NOCOV=y : قم بإزالة خيارات التغطية لاختبارات الوحدةkname=? : تغيير اسم ملف تسليم النواة بعد الإنشاء ، إذا كنت هنا للتسخ ، فكر في qemu و gdb للتصحيح والتحقيق.
scripts/toolchain.shkoraos/make/build_toolchain.sh (يستغرق المزيد من الوقت). ليس من السهل وصف ميزات kernel ، حيث أن معظم المكونات مطلوبة وجميع النواة توفر نفس الشيء تقريبًا ، ولكنها تختلف في الجودة والسلوك لجميع هذه الميزات.
يستخدم Koraos'kernel الذاكرة الظاهرية ، مع تخصيص الصفحة الأساسية. يستخدم إعادة التدوير المناسبة للصفحات ، ولكن لا يوجد مبادلة متوفرة. على الهندسة المعمارية Intel ، يتم تحديد تحديد ميزات وحدات المعالجة المركزية المناسبة ولكنه سيئ الاستخدام. kernel جاهزة متعددة النواة (آمنة من مؤشرات الترابط) ولكنها لا تزال تتطلب بعض الأعمال لاستخدامها.
النواة متعددة العمليات ، متعددة الخيوط ولكن ليست متعددة المستخدمين حتى الآن. يمكن إنشاء المهام لتكون إما على kernel أو في مساحة المستخدمين. يمكن إنشاء مهمة جديدة إما من Slate Clean (Window Way) أو Forked (Unix Way).
توفر kernel أنواعًا عديدة من الملفات والأجهزة: حظر الأجهزة أو أجهزة char أو الأنابيب أو الدليل (أو الصوت) أو الملفات العادية أو تدفقات الفيديو (السطح أو الكاميرا أو الشاشات) وأجهزة الشبكة والمقابس. (لاحظ أن أنواع الملفات تختلف عن UNIX).
يمكن الوصول إلى جميع هذه الملفات والأجهزة من خلال VFS المتطور (نظام الملفات الظاهرية) مع مرافق التخزين المؤقت الجيدة.
يدعم مكدس الشبكة البروتوكولات: Ethernet ، ARP ، IPv4 ، ICMP ، DHCP ، UDP ، TCP و DNS و NTP . قدمت kernel عميل DHCP أساسي يسمح بتكوين IP التلقائي.
قسم غير مكتمل
نظرًا لأن النظام غير يعمل بشكل كامل ، فإن معظم اختباراتي تتم باستخدام مؤشر ترابط kernel ، ولكن هنا بعض مكالمات نظام العمل - لا شيء ينتهي بعد:
/* --------
Tasks, Process & Sessions
--------- */
long sys_stop ( unsigned tid , int status );
long sys_sleep ( long timeout );
/* --------
Input & Output
--------- */
long sys_read ( int fd , char * buf , int len );
long sys_write ( int fd , const char * buf , int len );
long sys_open ( int fd , const char * path , int flags );
long sys_close ( int fd );
/* --------
File system
--------- */
int sys_pipe ( int * fds );
int sys_window ( int width , int height , unsigned features , unsigned evmask );
/* --------
Network
--------- */
int sys_socket ( int protocol , const char * address , int port );
/* --------
Memory
--------- */
void * sys_mmap ( void * address , size_t length , int fd , off_t off , unsigned flags );
long sys_munmap ( void * address , size_t length );
long sys_mprotect ( void * address , size_t length , unsigned flags );
/* --------
Signals
--------- */
/* --------
System
--------- */
long sys_ginfo ( unsigned info , void * buf , int len );
long sys_sinfo ( unsigned info , const void * buf , int len );
long sys_log ( const char * msg );البت الهدف وليس الملفات الحالية
kernel/types.h : المرجع الأنواع الأساسية وإعلان الهياكل غير شفافة.kernel/utils.h : توفير وقت التشغيل الأساسي مثل التخصيص والسلسلة والوقت.kernel/core.h : توفير الوصول إلى الهياكل الأساسية kSYS & kCPU .kernel/syscalls.h : قائمة روتين syscall كـ sys_* .kernel/io.h : واجهة لـ Ioport و Mmio و DMA.kernel/{...}.h : توفير واجهة برمجة التطبيقات لوحدة نواة kernel (المهام ، الذاكرة ، VFS ...).kernel/net/{...}.h : API لبروتوكول الشبكة (LO ، ETH ، IP4).kernel/bus/{...}.h : API لمزود الحافلات (PCI أو USB). لقد خططت لتسليم الإصدار 0.1 بمجرد أن أتمكن من تشغيل تسجيلات البرامج الأساسية وسطح المكتب و Krish و Folder و Lua ولدي نظام ملفات قابل للكتابة على الأقل (مثل VFAT أو EXT2).