💓 نبض القلب: تشريح 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.