🗄️ المحاسب الأكبر: تشريح mm/mod.rs (الذاكرة الفيزيائية)
مرحباً بك في إدارة الذاكرة الفيزيائية (PMM). هذا الملف وظيفته الإجابة على سؤال واحد فقط: "هل هذه الصفحة من الـ RAM متاحة أم محجوزة؟". ولكن الإجابة على هذا السؤال بسرعة فائقة تتطلب هندسة ذكية جداً.
1. وراثة خريطة الـ GRUB
كيف يعرف النظام حجم الـ RAM أصلاً؟ الـ BIOS هو الوحيد الذي يعرف ذلك أثناء إقلاع الجهاز، ويقوم بتسليم هذه المعلومات لمحمل الإقلاع (GRUB)، والذي بدوره يسلمنا إياها عبر mb2_ptr.
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 (أصفار ووحايد):
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 واحداً تلو الآخر في حلقة بطيئة. نستخدم تعليمات المعالج السحرية!
let free_bit = bits.trailing_ones() as usize;هذه التعليمة العتادية تعثر على أول 0 في غضون دورة معالج واحدة (Clock Cycle)، مما يجعل مدير الذاكرة لدينا قادراً على تلبية آلاف الطلبات في أجزاء من الثانية!