پرچم وقفه

پرچم وقفه (Interrupt Flag یا IF) یک بیت در ثبات پرچم های پردازنده است که تعیین می‌کند آیا CPU به وقفه‌های سخت‌افزاری قابل‌ماسک به‌صورت فوری پاسخ دهد یا خیر. اگر مقدار این پرچم برابر با ۱ باشد، وقفه‌های قابل‌ماسک فعال‌اند. اگر مقدار آن صفر تنظیم شود، این دسته از وقفه‌ها تا زمانی که دوباره فعال نشوند، غیرفعال خواهند بود. پرچم وقفه بر رسیدگی به وقفه‌های غیرقابل‌ پوشش (NMI) یا وقفه‌های نرم‌افزاری ایجادشده توسط دستور INT تأثیری ندارد.

## تنظیم و پاکسازی
در یک سامانه مبتنی بر معماری x86، دستورهای **CLI** (Clear Interrupt) و **STI** (Set Interrupt) به‌ترتیب برای غیرفعال‌کردن و فعال‌کردن پرچم وقفه به‌کار می‌روند. دستور **POPF** (Pop Flags) نیز یک واژه را از پشته برداشته و در ثبات پرچم ها قرار می‌دهد؛ بنابراین ممکن است بسته به مقداری که در بیت مربوط به پرچم وقفه در بالای پشته ذخیره شده است، پرچم وقفه فعال یا غیرفعال شود.

## سطح امتیاز
در سیستم‌هایی که حالت سطح بالاتر یا Privileged Mode را پشتیبانی می‌کنند، تنها برنامه‌های دارای سطح دسترسی بالا (معمولاً هسته سیستم‌عامل) می‌توانند پرچم وقفه را تغییر دهند. در معماری x86، این محدودیت فقط برای کدهای حالت محافظت شده (Protected Mode) اعمال می‌شود، در حالی که کدهای حالت واقعی (Real Mode) همیشه می‌توانند پرچم وقفه را تغییر دهند. دستورات CLI و STI از دستورات سطح بالا هستند و اجرای آن‌ها توسط برنامه‌های غیرمجاز باعث ایجاد خطای حفاظت عمومی (General Protection Fault) می‌شود. دستور POPF نیز در صورت اجرای برنامه غیرمجاز، پرچم وقفه را تغییر نخواهد داد.

### برنامه‌های قدیمی DOS
برخی از برنامه‌های قدیمی DOS که از یک گسترش‌دهنده DOS در حالت محافظت شده (Protected Mode DOS Extender) استفاده می‌کنند و کنترل‌کننده‌های وقفه (Interrupt Handler) خود را نصب می‌کنند—معمولاً بازی‌ها—از دستور CLI در این کنترل‌کننده‌ها برای غیرفعال کردن وقفه‌ها استفاده می‌کنند و سپس با دستور POPF (بعد از PUSHF متناظر) یا IRET (که پرچم‌ها را از پشته بازمی‌گرداند) وضعیت وقفه‌ها را بازیابی می‌کنند. این روش زمانی که برنامه در حالت واقعی (Real Mode) اجرا می‌شود به درستی کار می‌کند، اما زمانی که چنین برنامه‌هایی در محیط مبتنی بر DPMI روی سیستم‌های عامل مدرن اجرا شوند (مانند NTVDM در ویندوز NT و نسخه‌های بعدی)، مشکلاتی ایجاد می‌کند. از آنجا که CLI یک دستور سطح بالا (Privileged) است، هنگام تلاش برنامه برای اجرای آن، باعث ایجاد خطا و انتقال کنترل به سیستم عامل می‌شود. سیستم عامل معمولاً در این شرایط وقفه‌ها را به برنامه تحویل نمی‌دهد تا زمانی که برنامه دستور STI را اجرا کند (که اجرای آن نیز باعث خطای دیگری خواهد شد). اما دستور POPF سطح بالا نیست و به‌سادگی بدون بازگرداندن پرچم IF شکست می‌خورد. نتیجه این می‌شود که سیستم عامل دیگر وقفه‌ها را به برنامه ارسال نمی‌کند و برنامه در حالت توقف (Hang) باقی می‌ماند.برنامه‌های DOS که از گسترش‌دهنده حالت محافظت شده استفاده نمی‌کنند، چنین مشکلی ندارند، زیرا در حالت V86 اجرا می‌شوند و در این حالت دستور POPF باعث ایجاد خطا می‌شود و رفتار برنامه به درستی کنترل می‌شود.

راه‌حل‌های محدودی برای این مشکل وجود دارد. معمولاً تغییر برنامه امکان‌پذیر نیست، زیرا کد منبع در دسترس نیست و افزودن دستور STI در جریان دستورات بدون ویرایش گسترده در سطح اسمبلی امکان‌پذیر نمی‌باشد. حذف دستورهای CLI از برنامه یا نادیده گرفتن کامل CLI توسط میزبان V86 ممکن است باعث بروز باگ‌های دیگر شود، به خصوص اگر کنترل‌کننده‌های وقفه برنامه مهمان برای اجرا به صورت re-entrant طراحی نشده باشند. هرچند، هنگام اجرای برنامه روی پردازنده‌های مدرن، معمولاً سرعت اجرای آن‌ها به اندازه کافی بالاست که از هم‌پوشانی وقفه‌ها جلوگیری شود.

## غیرفعال کردن وقفه‌ها
در مجموعه دستورات x86، دستور CLI به‌طور معمول به‌عنوان مکانیزمی برای همگام‌سازی در سیستم‌های تک‌پردازنده‌ای استفاده می‌شود. به‌عنوان مثال، در سیستم‌های عامل، از CLI برای غیرفعال کردن وقفه‌ها استفاده می‌شود تا کد هسته (معمولاً درایور) بتواند از بروز شرایط رقابتی (Race Condition) در داخل کنترل‌کننده وقفه جلوگیری کند. این کار زمانی ضروری است که چندین ساختار داده مرتبط هم‌زمان بدون وقفه تغییر داده شوند.

## فعال کردن وقفه‌ها
STI مجموعه دستور های x86 وقفه ها را با قرار دادن بیا IF فعال می کند.

در برخی پیاده‌سازی‌های دستور فعال‌سازی وقفه‌ها، وقفه‌ها تا پس از اجرای دستور بعدی فعال نمی‌شوند. در این حالت، دنباله‌ای که ابتدا وقفه‌ها را فعال و بلافاصله غیرفعال می‌کند، باعث می‌شود که وقفه‌ها شناسایی نشوند.

## ملاحظات چندپردازنده‌ای
پرچم وقفه تنها بر یک پردازنده تأثیر می‌گذارد. در سیستم‌های چندپردازنده‌ای، کنترل‌کننده وقفه باید از مکانیزم‌های همگام‌سازی دیگر، مانند قفل‌ها (Locks)، استفاده کند

## همچنین ببینید

* وقفه
* ثبات FLAGS (محاسبات)
* اینتل ۸۲۵۹
* کنترل‌کننده وقفه قابل برنامه‌ریزی پیشرفته (APIC)
* کنترل‌کننده وقفه
* وقفه غیرقابل پوشش (NMI)
* کنترل‌کننده وقفه قابل برنامه‌ریزی (PIC)
* ایکس۸۶

## منابع


## پیوندهای خارجی

* دفترچه‌های راهنمای توسعه‌دهندگان نرم‌افزار معماری‌های اینتل ۶۴ و IA-32 - بازیابی‌شده در تاریخ ۲۰۱۷-۰۹-۱۴

 
رده:وقفه‌ها
رده:دستورالعمل‌های اکس۸۶