🚀 المرحلة 8: محمل ملفات ELF64 وواجهة النظام (qos_api) قيد التطوير
تاريخ الإنجاز: 2026-09-20 12:45 AM
الحالة: ✅ مكتمل ومختبر بنجاح على QEMU
🌟 ملخص الإنجاز والقفزة النوعية
في هذه المرحلة انتقلت نواة QOS Kernel من مجرد نواة أولية تنفذ مصفوفات كود آلي مكتوبة يدوياً (Raw Byte Arrays)، إلى نظام تشغيل حقيقي قادر على تحميل وتشغيل برامج مجمعة قياسية بصيغة ELF64 ومكتوبة بلغة Rust نقية ومستقلة تماماً عن كود النواة.
🏛️ المكونات المعمارية المنجزة
1. مكتبة واجهة النظام (qos_api)
- إنشاء مكتبة Rust مستقلة (
qos_api) لتكون الواجهة الوحيدة التي تعتمد عليها برامج المستخدم. - تثبيت أرقام استدعاءات النظام (Syscalls) للأبد:
SYS_EXIT = 0SYS_WRITE = 1SYS_SEND = 2SYS_RECV = 3SYS_YIELD = 4
- توفير دوال آمنة وعالية المستوى:
print(),write(),send(),recv(),exit(). - الفائدة المعمارية: تضمن أن أي تغيير داخلي في خوارزميات النواة مستقبلاً لن يكسر برامج المستخدم أو يتطلب إعادة تجميعها.
2. محمل برامج ELF64 في النواة (kernel/elf/mod.rs)
- قارئ لمعيار ELF64 يحلل ترويسات البرنامج (Program Headers).
- استخراج قطع التحميل (
PT_LOADsegments) وقراءة العناوين الافتراضية وصلاحيات كل قطعة (R,W,X). - التحقق الأمني من سلامة الترويسات (Magic Bytes
0x7F 'ELF', Little-Endian, x86_64).
3. ربط الذاكرة والتشغيل المستقل (spawn_from_elf)
- تخصيص فضاء عناوين افتراضية مستقلة (
CR3) للبرنامج. - حجز إطارات فيزيائية لكل صفحة من قطع الكود والبيانات، مع نسخ المحتوى من ملف الـ ELF.
- تطبيق صلاحيات الأمان لكل صفحة بدقة:
- كود البرنامج (
.text): Read + Execute (غير قابل للكتابة). - البيانات الثابتة (
.rodata): Read-Only (غير قابل للتنفيذ).
- كود البرنامج (
- إعداد مكدس نواة خاص بالعملية ومكدس مستخدم، وتوجيه مسجل التعليمات الأول (
RIP) إلى نقطة الدخول (e_entry) المحددة في الـ ELF.
4. أول برنامج مستخدم حقيقي (user/hello)
- برنامج مكتوب بلغة Rust عادية داخل مجلد منفصل
user/hello:
rust
#![no_std]
#![no_main]
use qos_api;
#[unsafe(no_mangle)]
pub extern "C" fn _start() -> ! {
qos_api::print("[Hello] First real ELF program on QOS!\n");
qos_api::exit();
}- تم تجميعه عبر
cargo buildالمستقل إلى ملف تنفيذيhello.elf. - قامت النواة بقراءة الملف، حجزه، وتشغيله بنجاح في Ring 3!