🚦 شرطي المرور: تشريح arch/pic.rs
مرحباً بك في متحكم المقاطعات (Programmable Interrupt Controller - PIC). هذا العتاد هو الذي يستقبل الإشارات الكهربائية من لوحة المفاتيح والماوس والمؤقت، ويخبر المعالج بها.
المشكلة التاريخية القاتلة (خطيئة شركة IBM)
في الحواسيب القديمة (وإلى يومنا هذا لأسباب التوافق)، صممت IBM المعالج بحيث أن أخطاء النظام (Exceptions) تأخذ الأرقام من 0 إلى 31. مثلاً:
- رقم
0= خطأ القسمة على صفر. - رقم
14= Page Fault (شاشة الموت).
ولكن الكارثة هي أن شريحة الـ PIC العتيقة 8259 كانت ترسل مقاطعات العتاد بأسماء من 0 إلى 15! إذا ضغطت على زر في الكيبورد (مقاطعة رقم 1)، المعالج سيظن أن هناك خطأ "Debug Exception" وسينهار النظام!! تداخل قاتل!
الحل: عملية الترحيل (Remapping)
وظيفة هذا الملف الأساسية هي إصدار أوامر للشريحة العتادية لنقل نطاق المقاطعات العتادية ليبدأ من الرقم 32 (0x20).
pub const PIC_1_OFFSET: u8 = 32; // إزاحة PIC الرئيسي ليبدأ من 32
pub const PIC_2_OFFSET: u8 = 32 + 8; // PIC الثانوي يبدأ من 40
pub unsafe fn init() {
let mut pics = ChainedPics::new(PIC_1_OFFSET, PIC_2_OFFSET);
pics.initialize(); // نأمر العتاد بتطبيق الإزاحة فوراً
}بفضل هذه الأسطر البسيطة، عندما تضغط على لوحة المفاتيح، سيصل المعالج الرقم 33 بدلاً من 1، وبذلك نفرّق بوضوح بين أخطاء المعالج الخطيرة وإشارات العتاد الطبيعية.