📬 مركز البريد الآمن: تشريح 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).