P01NT
0x2 03/07

المقاطعات

مرجعك لفهم المقاطعات في أنظمة التشغيل: تنظيم نظام الحاسوب من وحدات تحكم ومشغلات أجهزة، دورة عملية I/O حتى وصول المقاطعة، جدول متجهات المقاطعة، حفظ الحالة واستعادتها، مستويات الأولوية، وتسلسل المقاطعات في معالجات Intel.

· 7 دقائق قراءة · 1398 كلمة
المحتويات

بسم الله الرحمن الرحيم.

بعد التعرف على بنية أنظمة التشغيل، سيكون هذا المقال بإذن الله مرجعاً لك لفهم المقاطعات في أنظمة التشغيل.

منهجيتنا في هذه السلسلة ستكون ربط مثال بالمصطلحات والمفاهيم التي نأخذها، وستجد إن شاء الله صوراً توضيحية وأكواداً لتعميق الفهم أكثر.

تنظيم نظام الحاسوب (Computer-System Organization)

قبل أن ندخل في لب موضوعنا يجب أن نفهم تنظيم نظام الحاسوب — والسبب أن المفاهيم الرئيسية لا تصلح دون أساسيات يبنى عليها الفهم؛ فلا يُباع السمك لمن يقف على شاطئ البحر.

يتألف نظام الحاسوب من معالج واحد أو أكثر (CPUs) وعدة متحكمات (Device Controllers) تتصل مع بعضها عبر ناقل مشترك رئيسي (System Bus). هذا الناقل يسمح بالتواصل بين المكونات — المتحكمات والمعالجات — وبالوصول إلى الذاكرة المشتركة (Shared Memory):

تنظيم نظام الحاسوب شكل (1): تنظيم نظام الحاسوب

لهذا النظام مكونات أساسية لا بد معرفتها:

1. وحدات التحكم (Device Controllers): مسؤولة عن أجهزة محددة (مثل مشغلات الأقراص Disk Drivers وأجهزة الصوت Audio Devices وشاشات العرض Graphics Displays).

وللوحدات التحكم نقطة جوهرية: قد يدير كل وحدة تحكم عدة أجهزة (مثلاً منفذ USB الواحد يمكن أن يخدم فأرة ولوحة مفاتيح).

طيب، كيف يتم نقل البيانات بين وحدات التحكم والمعالجات؟ كل وحدة تحكم تحتوي على ذاكرة مؤقتة محلية (Local Buffer) ومسجلات خاصة (Special-Purpose Registers) تساعدها على التواصل.

2. برامج تشغيل الأجهزة (Device Drivers): برنامج خاص لكل وحدة تحكم؛ يفهم هذا المشغِّل وحدة التحكم ويوفر لبقية نظام التشغيل واجهة موحدة للجهاز — أي أنه يجعل النواة Kernel قادرة على التواصل مع وحدة التحكم:

المشغلات ووحدات التحكم شكل (2): موقع برامج التشغيل

3. التنفيذ المتوازٍ (Parallel Execution): يعمل المعالج ووحدات التحكم بشكل متوازٍ، وتتنافس جميعها على دورات الذاكرة (Memory Cycles):

التنفيذ المتوازي شكل (3): تنافس المكونات على دورات الذاكرة

4. وحدة التحكم بالذاكرة (Memory Controller): تنظم الوصول إلى الذاكرة المشتركة لمنع التصادمات، فيتم مزامنة الوصول إلى الذاكرة عبرها:

وحدة التحكم بالذاكرة شكل (4): مزامنة الوصول للذاكرة

كيف تتم عملية إدخال/إخراج؟

سنتعرف على كيفية عمل هذا النظام عبر شرح المقاطعات. ولنأخذ مثالاً على عملية حاسوبية عبارة عن برنامج ينفذ عملية I/O:

لبدء عملية الإدخال/الإخراج، يقوم مشغّل الجهاز (Device Driver) بتحميل البيانات في مسجلات وحدة التحكم (Device Controller). بعد ذلك تفحص وحدة التحكم محتويات هذه المسجلات لتحديد ما ينبغي فعله (مثل قراءة حرف من لوحة المفاتيح). يبدأ المتحكم بنقل البيانات من الجهاز إلى ذاكرته المؤقتة المحلية (Local Buffer)، وبمجرد اكتمال النقل يخطر مشغّل الجهاز بانتهاء العملية.

بعدها يسلم مشغّل الجهاز التحكم لأجزاء أخرى في نظام التشغيل، وقد يعيد البيانات نفسها أو مؤشراً يحدد موقع البيانات في الذاكرة إذا كانت العملية «قراءة»، وقد يعيد أيضاً معلومات الحالة (Status Info) مثل «اكتملت العملية بنجاح» أو «الجهاز مشغول».

السؤال: كيف يُخطر مشغّل الجهاز بأنه أنهى عمله؟ يتم ذلك عن طريق المقاطعة (Interrupt).

ما هي المقاطعة؟ (What Is an Interrupt?)

يمكن للعتاد تشغيل مقاطعة في أي لحظة عبر إرسال إشارة على الناقل (Bus) إلى المعالج CPU. (قد يتضمن النظام أكثر من ناقل، لكن الـ System Bus هو مسار الاتصال الرئيسي بين المكونات الرئيسية.) وتستخدم المقاطعات لأغراض كثيرة، وهي جزء أساسي من كيفية تفاعل أنظمة التشغيل مع العتاد.

مثال بلغة Assembly — معالجة مقاطعة لوحة مفاتيح نموذجية:

push  eax        ; حفظ السجل قبل استخدامه
in    al, 60h    ; قراءة رمز المفتاح (Scan Code) من منفذ بيانات لوحة المفاتيح 60h
mov   al, 20h    ; تحميل قيمة EOI‏ (0x20) في AL — وليست قراءة!
out   20h, al    ; إرسال إشارة End Of Interrupt إلى منفذ التحكم في الـ PIC (0x20)
pop   eax        ; استعادة السجل
iret             ; العودة من المقاطعة

لاحظ التسلسل: نقرأ رمز المفتاح من المنفذ 60h، ثم نرسل إلى وحدة تحكم المقاطعات PIC إشارة انتهاء الخدمة (قيمة 0x20 عبر المنفذ 20h) حتى تعرف أننا انتهينا من معالجة المقاطعة ويمكنها قبول مقاطعات جديدة.

طيب، عندما تُرسل مقاطعة إلى الـ CPU ماذا يحدث؟

يتوقف الـ CPU عما كان يفعله فوراً وينقل التنفيذ إلى موقع ثابت (Fixed Location). وماذا يحتوي هذا الموقع؟ عادةً يحتوي على عنوان البداية حيث يوجد روتين خدمة المقاطعة (Interrupt Service Routine – ISR).

يمكننا تشبيه الـ ISR بمركز تنظيم للمقاطعات؛ فهو الذي يدير شؤون المقاطعات. وبعد نقل التنفيذ إلى الموقع الثابت يتم تنفيذ الروتين، وعند الانتهاء يستأنف المعالج العملية التي تمت مقاطعتها:

مسار المقاطعة حتى الـ ISR شكل (5): من إشارة المقاطعة إلى روتين الخدمة

ولهذا تعد المقاطعات جزءاً مهماً من بنية الحاسب، ولكل تصميم كمبيوتر آلية مقاطعة (Mechanism) خاصة به مع كثير من الوظائف المشتركة. ولا بد أن تنقل المقاطعة التحكم إلى روتين خدمة المقاطعة المناسب.

جدول متجهات المقاطعة (Interrupt Vector)

طيب، كيف تجري العملية؟

الطريقة المباشرة لإدارة هذا النقل هي استدعاء روتين عام يفحص معلومات المقاطعة ثم يستدعي المعالج الخاص بالمقاطعة. لكن يجب أن يكون التعامل مع المقاطعات سريعاً لأنها تحدث بشكل متكرر، لذلك يمكن استخدام جدول مؤشرات لإجراءات المقاطعة بدلاً من ذلك الروتين العام لتوفير السرعة اللازمة؛ فيُستدعى روتين المقاطعة بشكل غير مباشر عبر الجدول دون الحاجة إلى روتين وسيط ينظم المقاطعات.

بشكل عام يُخزن جدول المؤشرات في الذاكرة المنخفضة (أول مئة موقع من الذاكرة تقريباً)، وتحتوي هذه المواقع على عناوين إجراءات خدمة المقاطعة.

تُفهرس هذه المصفوفة — التي اسمها Interrupt Vector — بواسطة رقم فريد (Unique Number) يُرفق مع طلب المقاطعة لتوفير عنوان الـ ISR الخاص بالجهاز المقاطِع. وهذه هي الطريقة التي تعتمدها أنظمة Windows وUnix في إرسال المقاطعات.

حفظ الحالة واستعادتها (Saved State)

كيف تستعاد معلومات المقاطعة المتروكة بعد عودة المعالج؟

بنية المقاطعة يجب أن تحفظ معلومات الحالة الخاصة بأي شيء تمت مقاطعته، بحيث يمكن استعادة تلك المعلومات بعد معالجة المقاطعة. وفي بعض الأحيان يحتاج الـ ISR إلى تعديل حالة المعالج (مثلاً عن طريق تعديل قيم السجلات) — طيب، ماذا يجب أن يحدث هنا؟ يجب على الروتين أن يحفظ الحالة الحالية بشكل صريح أولاً، ثم يستعيدها قبل العودة.

بعد معالجة المقاطعة يُحمَّل عنوان العودة المحفوظ في عداد البرنامج (Program Counter)، وتستأنف العمليات أو الحسابات التي كانت مقاطَعة وكأن المقاطعة لم تحدث من الأساس.

آلية المقاطعة (Interrupt Mechanism)

كيف تعمل آلية المقاطعة؟

يحتوي المعالج على سلك يسمى خط طلب المقاطعة (Interrupt-Request Line)، ويفحص المعالج هذا السلك بعد تنفيذ كل تعليمة. عندما يكتشف المعالج أن وحدة تحكم قد أرسلت إشارة على السلك، يقرأ رقم المقاطعة وينتقل إلى روتين معالجة المقاطعة (Interrupt-Handler Routine) باستخدام رقم المقاطعة هذا كمؤشر في جدول متجهات المقاطعة (Interrupt Vector)، ثم يبدأ التنفيذ عند العنوان المرتبط بهذا المؤشر.

وما وظيفة الـ Interrupt Handler؟

يقوم بحفظ الحالات التي سيغيرها أثناء عمله، ويحدد سبب المقاطعة وينفذ المعالجة اللازمة، بعدها يستعيد الحالة التي حفظها وينفذ تعليمة العودة من المقاطعة ليعيد الـ CPU إلى حالة التنفيذ التي كان عليها قبل المقاطعة:

آلية المقاطعة ودورة المعالج شكل (6): دورة آلية المقاطعة

وتسمى هذه العملية آلية المقاطعة (Interrupt Mechanism). وفي الأنظمة الحديثة نحتاج ميزات أكثر تطوراً لمعالجة المقاطعات (Interrupt Handling).

متطلبات الأنظمة الحديثة

الأهم الذي يجب التركيز عليه: القدرة على تأجيل معالجة المقاطعات أثناء المعالجة الحرجة (Critical Processing) — تخيل أن لديك مهمة أساسية يعمل عليها الـ CPU وتظهر أثناءها مقاطعة توقفها؛ قد ينهار النظام.

حُلَّت هذه المشكلة بجعل المقاطعات ذات مستويات، بحيث يميز نظام التشغيل بين المقاطعات ذات الأولوية العالية والمنخفضة، وتكون الاستجابة بدرجة مناسبة من الاستعجال. ووفِّرت هذه الميزات بواسطة الـ CPU ووحدة تحكم المقاطعات (Interrupt Controller).

وشهدت الحواسيب الحديثة نقلة نوعية: أصبحت المعالجات تحتوي على خطَّين لطلب المقاطعة (Two Interrupt Request Lines):

  1. المقاطعة غير القابلة للإخفاء (Nonmaskable): مخصصة لأحداث مثل أخطاء الذاكرة التي لا يمكن الاسترداد منها.
  2. المقاطعة القابلة للإخفاء (Maskable): يمكن للمعالج تعطيل هذه المقاطعات مؤقتاً — بتوجيه من نظام التشغيل — قبل تنفيذ تسلسلات تعليمات حرجة يجب ألا تنقطع، ثم إعادة تمكينها بعد انتهائها.

تسلسل المقاطعات (Interrupt Chaining)

لكن في الأنظمة الحديثة ظهرت مشكلة:

كما قلنا، الغرض من آلية جدول متجهات المقاطعة هو تقليل الحاجة إلى معالج مقاطعة واحد (Single Interrupt Handler) لجميع مصادر المقاطعة المحتملة. لكن في الواقع تحتوي أجهزة الكمبيوتر على عدد من الأجهزة — وبالتالي معالجات المقاطعة المرتبطة بها — أكبر من عناصر العناوين الموجودة في الـ Interrupt Vector.

كيف حُلَّت هذه المشكلة؟

باستخدام تسلسل المقاطعة (Interrupt Chaining): بحيث يشير كل عنصر في الـ Interrupt Vector إلى رأس قائمة من معالجات المقاطعة (Handlers). وعند حدوث مقاطعة تُستدعى المعالجات الموجودة في القائمة واحدة تلو الأخرى حتى يُعثر على المعالج المطلوب.

هذا الهيكل هو حل وسط بين العبء الإضافي لجدول مقاطعات ضخم وعدم كفاءة الإرسال إلى معالج مقاطعة واحد. وهذا الجدول يوضح تصميم معالجات المقاطعة في معالجات Intel:

تصميم مقاطعات Intel شكل (7): متجهات المقاطعة في معالجات Intel

الأرقام من 0 إلى 31 تُستخدم للإشارة إلى حالات الخطأ المختلفة، وهي غير قابلة للإخفاء (Nonmaskable).

أما من 32 إلى 255 فتستخدم لأغراض مثل المقاطعات التي تولدها الأجهزة، وهي قابلة للإخفاء (Maskable).

وكما ذكرنا، يطبق نظام أولويات المقاطعات (Interrupt Priority Levels) الذي يمكّن المعالج من ترتيب المقاطعات حسب الأولوية وتنفيذها وفقاً لها.

الخلاصة

تستخدم المقاطعات في جميع أنظمة التشغيل للتعامل مع الأحداث غير المتزامنة. وتُطلب المقاطعات من وحدات التحكم بالأجهزة (Device Controllers) ومن أعطال العتاد — لماذا؟ لتمكين إنجاز الأعمال الأهم أولاً عبر نظام أولويات المقاطعات. والتعامل الفعال مع المقاطعات ضروري لتحقيق أداء جيد للنظام.

لا تنسونا من صالح دعائكم.