📄 ملف 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.