Skip to content

⚡ شبكة الصيد: تشريح interrupts/mod.rs (المقاطعات والأخطاء) ​

بدون هذا الملف، أي خطأ صغير (كقسمة على صفر) سيجعل المعالج يتجمد ويغلق الجهاز فوراً. هذا الملف هو "شبكة الصيد" التي تلتقط الأخطاء قبل أن تدمر النظام!

1. جدول طوارئ المعالج (IDT) ​

نقوم بإنشاء قائمة بالهواتف التي يجب أن يتصل بها المعالج عند حدوث أي طارئ:

rust
lazy_static! {
    static ref IDT: InterruptDescriptorTable = {
        let mut idt = InterruptDescriptorTable::new();
        // 1. أخطاء النظام (Exceptions)
        idt.breakpoint.set_handler_fn(breakpoint_handler);
        idt.page_fault.set_handler_fn(page_fault_handler);
        // ...

        // 2. إشارات العتاد الخارجية
        // المؤقت الزمني تمت إزاحته إلى رقم 0x20
        idt[TIMER_VECTOR].set_handler_fn(timer_handler);

        idt
    };
}

2. شاشة الموت المبسطة (Page Fault) ​

عندما يحاول برنامج اختراق الذاكرة، يحدث Page Fault. المعالج يقفز فوراً لهذه الدالة:

rust
extern "x86-interrupt" fn page_fault_handler(_stack_frame: InterruptStackFrame, _error_code: PageFaultErrorCode) {
    let mut out = VgaTextOutput;
    out.write_colored("
[EXCEPTION: PAGE FAULT]
", Color::White, Color::Red);
    loop { x86_64::instructions::hlt(); } // غيبوبة أبدية لإنقاذ الجهاز
}

في المستقبل، بدلاً من إدخال النظام في غيبوبة (Kernel Panic)، سيقوم هذا المعالج بـ "قتل" البرنامج المذنب فقط ويترك بقية النظام يعمل بسلام.

3. مقاطعة المؤقت (نبضات المجدول) ​

هذه هي أهم دالة في النظام بأكمله!

rust
extern "x86-interrupt" fn timer_handler(_stack_frame: InterruptStackFrame) {
    unsafe { crate::sched::tick(); } // 1. المجدول! أرجوك قم بتبديل البرنامج

    // 2. EOI: End Of Interrupt
    unsafe { crate::arch::x86_64::pic::send_eoi(0); }
}

السر العتادي: إشارة شكر الـ EOI إلزامية. إذا لم تشكر العتاد على إرسال النبضة، سيغضب ولن يرسل لك أي نبضات أخرى أبداً وسيتجمد الحاسوب فوراً!

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