Skip to content

📬 مركز البريد الآمن: تشريح ipc/mod.rs ​

بما أن البرامج في QOS معزولة تماماً في غرف Ring 3 بسبب الـ VMM، كيف يمكن لمتصفح الإنترنت أن يطلب من خادم الشاشة رسم نافذة؟ الحل الوحيد هو "البريد الداخلي" للنواة (IPC - Inter-Process Communication).

1. موزع النداءات (The Dispatcher) ​

حين ينفذ البرنامج تعليمة syscall، يهبط المعالج مباشرة في هذه الدالة الضخمة:

rust
pub extern "C" fn syscall_dispatch(arg1: u64, arg2: u64, arg3: u64, /*...*/ syscall_num: u64) -> u64 {
    match syscall_num {
        SYS_SEND  => { /* كود الإرسال */ }
        SYS_RECV  => { /* كود الاستقبال */ }
        SYS_SPAWN => { /* ... */ }
        _ => u64::MAX,
    }
}

هنا نقرأ رقم الطلب syscall_num ونقرر ماذا نفعل.

2. الإرسال الآمن وتفعيل المنافذ ​

عندما يحاول البرنامج إرسال رسالة:

rust
SYS_SEND => {
    let port_index = arg1 as usize; // لاحظ: يحدد منفذاً، وليس PID!
    
    // النواة تسأل: هل تملك صلاحية على هذا المنفذ؟ ومن هو الهدف الفعلي؟
    let dest_slot = unsafe { crate::sched::resolve_port(sender_slot, port_index) };
    if dest_slot.is_none() { return u64::MAX - 1; } // رفض أمني قاطع!
    
    // ... إذا سُمح له، يتم نسخ الرسالة من ذاكرته إلى صندوق بريد الهدف
    mb.push(msg);
    crate::sched::wake_task(dest_slot); // إيقاظ الهدف فوراً!
}

3. حماية حدود الذاكرة (validate_user_buffer) ​

ماذا لو وضع البرنامج المؤشر (Pointer) الخاص برسالته متعمداً داخل ذاكرة النواة الخطيرة لكي يقرأ أسرارها؟ هنا يأتي دور الجدار الحديدي:

rust
if !vmm::validate_user_buffer(msg_ptr, msg_len) {
    return u64::MAX; // احتيال مكتشف: يتم رفض الطلب فوراً!
}

بهذه الدالة، نضمن أن البرامج لا تستطيع قراءة أو كتابة أي بايت خارج فضاء الذاكرة الخاص بها (User Space).

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