Skip to content

🗄️ المحاسب الأكبر: تشريح mm/mod.rs (الذاكرة الفيزيائية) ​

مرحباً بك في إدارة الذاكرة الفيزيائية (PMM). هذا الملف وظيفته الإجابة على سؤال واحد فقط: "هل هذه الصفحة من الـ RAM متاحة أم محجوزة؟". ولكن الإجابة على هذا السؤال بسرعة فائقة تتطلب هندسة ذكية جداً.

1. وراثة خريطة الـ GRUB ​

كيف يعرف النظام حجم الـ RAM أصلاً؟ الـ BIOS هو الوحيد الذي يعرف ذلك أثناء إقلاع الجهاز، ويقوم بتسليم هذه المعلومات لمحمل الإقلاع (GRUB)، والذي بدوره يسلمنا إياها عبر mb2_ptr.

rust
if tag.tag_type == 6 { // Multiboot2 Memory Map Tag
    let start = (entry.base_addr as usize + PAGE_SIZE - 1) / PAGE_SIZE;
    let end   = (entry.base_addr + entry.length) as usize / PAGE_SIZE;
    for frame in start..end.min(MAX_PAGES) {
        mark_free(frame); // الإطار متاح!
    }
}

2. عبقرية الـ Bitmap (الضغط الأقصى) ​

بدلاً من إنشاء مصفوفة ضخمة لتخزين حالة كل إطار (Frame) من الذاكرة (مما سيستهلك الـ RAM نفسه!)، نستخدم مصفوفة من الـ Bits (أصفار ووحايد):

rust
const MAX_PAGES: usize = 32768;  // ندعم حتى 128MB
const BITMAP_SIZE: usize = MAX_PAGES / 64; // 512 عنصر u64 فقط (4 كيلوبايت!)

static BITMAP: [AtomicU64; BITMAP_SIZE] = [ZERO; BITMAP_SIZE];

هل تتخيل؟ نحن ندير 128,000,000 بايت باستخدام 4096 بايت فقط! كل بت يمثل صفحة بحجم 4KB (0 = فارغ، 1 = محجوز).

3. الحجز بسرعة البرق (Trailing Ones) ​

عندما يطلب النظام ذاكرة عبر alloc_frame()، فنحن لا نمر على الـ Bits واحداً تلو الآخر في حلقة بطيئة. نستخدم تعليمات المعالج السحرية!

rust
let free_bit = bits.trailing_ones() as usize;

هذه التعليمة العتادية تعثر على أول 0 في غضون دورة معالج واحدة (Clock Cycle)، مما يجعل مدير الذاكرة لدينا قادراً على تلبية آلاف الطلبات في أجزاء من الثانية!

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