Skip to content

🧬 الحمض النووي للأنوية: تشريح arch/percpu.rs ​

هذا الملف يمثل الاستعداد للمستقبل (تعدد الأنوية Multi-core). في الأنظمة متعددة الأنوية (SMP)، كل Core في المعالج ينفذ برنامجاً مختلفاً. كيف يمكن للـ Core رقم 1 أن يعرف من هو "برنامجي الحالي" دون أن يتدخل في "البرنامج الحالي" للـ Core رقم 2؟

الخدعة المعمارية: مسجل GS ​

في معمارية x86_64، هناك مسجلات تُدعى (Segment Registers) مثل FS و GS. في الأنظمة الحديثة لم نعد نستخدمها لتقسيم الذاكرة، بل نستخدمها كـ "مؤشر خاص لكل نواة عتادية".

rust
#[repr(C)]
pub struct PerCpuData {
    pub cpu_id: u32,
    pub current_task_id: u64,
    pub kernel_stack_top: u64,
}

pub unsafe fn init_percpu(data_ptr: *const PerCpuData) {
    // نكتب عنوان هيكل البيانات الخاص بهذا الـ Core في مسجل MSR الخاص بالـ GS
    // GS.Base = 0xC0000101
    Msr::new(0xC0000101).write(data_ptr as u64); 
}

بفضل هذه التقنية، عندما يريد الـ Scheduler معرفة الـ PID الحالي، فإنه لا يبحث في مصفوفة عامة (Global Array) قد تسبب تداخلاً (Race Condition)، بل يقرأ مباشرة من GS:current_task_id. هذا يجعل النظام سريعاً وآمناً عند تفعيل بقية أنوية المعالج!

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