🧬 الحمض النووي للأنوية: تشريح 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. هذا يجعل النظام سريعاً وآمناً عند تفعيل بقية أنوية المعالج!