Skip to content

🧠 جدار العزل الفولاذي: تشريح mm/vmm.rs (الذاكرة الافتراضية) ​

هذا هو أذكى وأعقد وأهم ملف أمني في نظام QOS! الـ VMM (Virtual Memory Manager) هو الساحر الذي يقنع كل برنامج بأنه يمتلك الـ RAM بالكامل، وهو السجان الذي يمنع البرامج من رؤية ذاكرة بعضها البعض.

1. المشي في الظلام (Page Walk) ​

كلما طلب برنامج عنواناً وهمياً (مثل 0x8000_0000)، يجب على المعالج ترجمته لعنوان فيزيائي (حقيقي). يحدث هذا عبر الغوص في 4 مستويات من الجداول (4-Level Paging). دالة map_page وظيفتها بناء هذه الجداول:

rust
pub unsafe fn map_page(virt: u64, phys: u64, flags: u64) -> Result<(), &'static str> {
    let pml4_phys = read_cr3(); // المستوى الرابع (الرئيسي)

    // نتأكد من وجود الجداول الفرعية، وإذا لم تكن موجودة نخلقها ونصفرها!
    let pdp_phys = ensure_table(pml4_phys, pml4_index(virt), intermediate_flags)?;
    let pd_phys = ensure_table(pdp_phys, pdp_index(virt), intermediate_flags)?;
    let pt_phys = ensure_table(pd_phys, pd_index(virt), intermediate_flags)?;

    // أخيراً: نكتب العنوان الفيزيائي في الجدول الأخير
    let pt = pt_phys as *mut u64;
    pt.add(pt_index(virt)).write_volatile((phys & ADDR_MASK) | flags | PTE_PRESENT);
    Ok(())
}

2. السر الأمني: فضاء CR3 المستقل لكل عملية ​

في الأنظمة الدقيقة (Microkernels)، كل خادم (كخادم الملفات) يعيش في عزلة تامة. الدالة السحرية create_user_address_space هي المسؤولة عن ذلك:

rust
pub unsafe fn create_user_address_space() -> Result<u64, &'static str> {
    // 1. نخصص جدول رئيسي (PML4) جديد كلياً
    let new_pml4_phys = super::alloc_frame().unwrap();
    zero_frame(new_pml4_phys);

    // 2. نستنسخ جداول النواة فقط (لكي يستطيع البرنامج التواصل مع النواة)
    new_pdp.add(0).write_volatile(boot_pdp.add(0).read_volatile()); // 0-1GB
    new_pdp.add(1).write_volatile(boot_pdp.add(1).read_volatile()); // 1-2GB

    // 3. نعيد عنوان الجدول الجديد لكي يُحمل في المسجل CR3 عند التبديل لهذه العملية
    Ok(new_pml4_phys)
}

النتيجة؟ خادم الملفات مستحيل أن يقرأ مصفوفات خادم الشاشة، لأنهما ببساطة يملكان جدولي CR3 مختلفين، وما هو موجود عند الأول، لا وجود له في خريطة الثاني (Page Fault)!

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