Skip to content

← العودة لمجلد init

📄 ملف main.rs (المدير الرئيسي) ​

هذا الملف يحتوي على الدالة الرئيسية _start التي يتم تنفيذها فور تشغيل الخدمة في فضاء المستخدم.

1. الإقلاع والاختبار الذاتي (Smoke Test) ​

rust
let mut registry = ServiceRegistry::new();
sys::print("[init] Service registry initialized (0/16)\n");

let test_name = b"test_svc\0\0\0\0\0\0\0\0"; 
if registry.register(test_name, 1) { ... }
if registry.lookup(b"test_svc").is_some() { ... }

في المرحلة الحالية، يقوم الخادم باختبار داخلي لتسجيل خدمة وهمية test_svc والبحث عنها للتأكد من سلامة كود مسجل الخدمات قبل البدء.

2. حلقة المعالجة الرئيسية (Event Loop) ​

الخادم يدخل في حلقة لا نهائية (Infinite Loop) يستقبل فيها الرسائل الواردة من البرامج الأخرى:

rust
let mut buf = [0u8; MSG_SIZE];
loop {
    let received = sys::recv(&mut buf);
    if received == 0 || received == u64::MAX {
        sys::yield_now(); // تحرير المعالج إذا لم يكن هناك رسائل
        continue;
    }
    
    let msg = ServiceMsg { raw: buf };
    match msg.kind() {
        MSG_REGISTER => { ... }
        MSG_LOOKUP => { ... }
        _ => {}
    }
}

يستخدم الخادم sys::recv (من qos_api) للاستماع للرسائل، و sys::yield_now لعدم استهلاك طاقة المعالج (100% CPU usage) إذا كانت قائمة الرسائل فارغة.

3. معالج الانهيارات (Panic Handler) ​

rust
#[panic_handler]
fn panic(_info: &core::panic::PanicInfo) -> ! {
    sys::print("[init] PANIC — system halted\n");
    sys::exit() 
}

إذا حدث خطأ كارثي داخل الخادم، يتم طبع رسالة وإيقاف الخدمة عبر إبلاغ النواة من خلال الاستدعاء sys::exit.

تم تطويره بحب بواسطة مجتمع Qtoom.