Skip to content

💓 نبض القلب: تشريح arch/pit.rs ​

الـ PIT (Programmable Interval Timer 8254) مذبذب عتادي يرسل نبضات منتظمة للمعالج. بدونه ما في مقاطعة دورية، وبدونها ما يشتغل التبديل الاستباقي بين المهام.

الثوابت ​

rust
const PIT_FREQUENCY: u32 = 1_193_182; // تردد الشريحة الثابت
const TARGET_HZ: u32 = 100;           // مقاطعة كل ~10ms

نكوّن Channel 0 حتى يرسل IRQ0 بتردد ~100Hz، ونستخدمه لتشغيل المجدول.

البرمجة ​

rust
pub unsafe fn init() {
    let divisor: u16 = (PIT_FREQUENCY / TARGET_HZ) as u16; // 11931

    // Channel 0, Access lobyte/hibyte, Mode 3 (square wave)
    outb(PIT_COMMAND, 0x36);
    outb(PIT_CHANNEL0, (divisor & 0xFF) as u8);        // Low byte
    outb(PIT_CHANNEL0, ((divisor >> 8) & 0xFF) as u8); // High byte
}

الأمر 0x36 يختار Channel 0 بوصول lobyte ثم hibyte وMode 3. بعدها نرسل المعامل (11931) على دفعتين: البايت الأدنى ثم الأعلى.

ماذا يحدث بعد ذلك؟ ​

كل نبضة (IRQ0) تصل لـ timer_handler بـ interrupts/mod.rs عبر vector 0x20، وهو يستدعي sched::tick() ثم يرسل EOI للـ PIC.

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