سیگنال های وقفه ممکن است در پاسخ به رویدادهای سخت افزاری یا نرم افزاری صادر شوند. این وقفه ها به ترتیب به عنوان وقفه های سخت افزاری یا وقفه های نرم افزاری طبقه بندی می شوند. برای هر پردازنده خاص، تعداد انواع وقفه توسط شکل و طراحی آن محدود می شود.
وقفه های سخت افزاری
وقفه سختافزاری وضعیتی است که به وضعیت سختافزار مربوط میشود که ممکن است توسط یک دستگاه سختافزار خارجی، به عنوان مثال، یک خط درخواست وقفه (IRQ) در کامپیوتر شخصی علامتگذاری شود، یا توسط دستگاههای تعبیهشده در منطق پردازنده (مثلا، تایمر CPU در IBM System/370)، برای برقراری ارتباط که دستگاه به توجه سیستم عامل (OS) یا، در صورت عدم وجود سیستم عامل، از برنامه "bare-metal" در حال اجرا بر روی CPU نیاز دارد. چنین دستگاه های خارجی ممکن است بخشی از کامپیوتر (به عنوان مثال، کنترل کننده دیسک) یا تجهیزات جانبی خارجی باشند. به عنوان مثال، فشار دادن یک کلید صفحه کلید یا حرکت ماوس متصل به پورت PS/2 باعث ایجاد وقفه های سخت افزاری می شود که باعث می شود پردازشگر فشار دادن کلید یا موقعیت ماوس را بخواند.
وقفه های سخت افزاری می توانند به طور ناهمزمان با توجه به ساعت پردازنده و در هر زمانی در طول اجرای دستورالعمل وارد شوند. در نتیجه، همه سیگنالهای وقفه سختافزاری ورودی با همگامسازی آنها با ساعت پردازنده شرطی میشوند و تنها در مرزهای اجرای دستورالعملها عمل میکنند.
در بسیاری از سیستم ها، هر دستگاه با یک سیگنال IRQ خاص مرتبط است. این امکان را فراهم می کند تا سریعاً مشخص شود که کدام دستگاه سخت افزاری درخواست سرویس می کند و سرویس دهی آن دستگاه را تسریع بخشد.
در برخی از سیستمهای قدیمیتر، مانند CDC 3600 1964، همه وقفهها به یک مکان رفتند، و سیستمعامل از یک دستورالعمل تخصصی برای تعیین وقفه برجسته با بالاترین اولویت استفاده کرد. در سیستم های معاصر، معمولاً یک روال وقفه مجزا برای هر نوع وقفه (یا برای هر منبع وقفه) وجود دارد که اغلب به صورت یک یا چند جدول برداری وقفه اجرا می شود.
Masking
پوشاندن وقفه به معنای غیرفعال کردن آن است، در حالی که پنهان کردن وقفه به معنای فعال کردن آن است.
پردازندهها معمولاً دارای یک رجیستر ماسک وقفه داخلی هستند، که امکان فعال کردن (و غیرفعال کردن) انتخابی وقفههای سختافزاری را فراهم میکند. هر سیگنال وقفه با بیتی در ثبات ماسک مرتبط است. در برخی از سیستم ها، وقفه زمانی که بیت تنظیم شده است فعال می شود و زمانی که بیت پاک است غیرفعال می شود. در برخی دیگر، برعکس است، و یک بیت مجموعه ای وقفه را غیرفعال می کند. هنگامی که وقفه غیرفعال است، سیگنال وقفه مرتبط ممکن است توسط پردازنده نادیده گرفته شود یا در حالت تعلیق باقی بماند. سیگنال هایی که تحت تأثیر ماسک قرار می گیرند، وقفه های ماسک پذیر نامیده می شوند.
برخی از سیگنال های وقفه تحت تأثیر ماسک وقفه قرار نمی گیرند و بنابراین نمی توان آنها را غیرفعال کرد. به این وقفه های غیر قابل پوشش (NMI) می گویند. اینها رویدادهای با اولویت بالا را نشان میدهند که تحت هیچ شرایطی نمیتوان آنها را نادیده گرفت، مانند سیگنال زمانبندی تایمر Watchdog.
وقفه های جعلی
وقفه ساختگی یک وقفه سخت افزاری است که هیچ منبعی برای آن یافت نمی شود. اصطلاح "وقفه فانتوم" یا "وقفه شبح" نیز ممکن است برای توصیف این پدیده استفاده شود. وقفه های کاذب معمولاً با یک مدار قطع سیمی یا سیمی متصل به ورودی پردازنده حساس به سطح مشکل ایجاد می کنند. شناسایی چنین وقفه هایی ممکن است زمانی که یک سیستم بد رفتار می کند دشوار باشد.
در یک مدار سیمی-OR، شارژ/دشارژ خازنی انگلی از طریق مقاومت بایاس خط وقفه باعث تاخیر کمی قبل از اینکه پردازنده تشخیص دهد که منبع وقفه پاک شده است، می شود. اگر دستگاه قطع کننده خیلی دیر در روال سرویس وقفه (ISR) پاک شود، زمان کافی برای بازگشت مدار قطع به حالت خاموش قبل از پایان نمونه فعلی ISR وجود نخواهد داشت. نتیجه این است که پردازنده فکر می کند وقفه دیگری در انتظار است، زیرا ولتاژ در ورودی درخواست وقفه آن به اندازه کافی بالا یا پایین نخواهد بود که منطق داخلی بدون ابهام 1 یا منطق 0 ایجاد کند. وقفه ظاهری منبع قابل شناسایی نخواهد داشت، بنابراین " نام مستعار یک وقفه کاذب همچنین ممکن است نتیجه ناهنجاریهای الکتریکی به دلیل طراحی مدار معیوب، سطوح نویز بالا، تداخل، مشکلات زمانبندی، یا به ندرت، خطای دستگاه باشد.
اگر ISR احتمال وقوع چنین وقفه ای را در نظر نگیرد، یک وقفه کاذب ممکن است منجر به بن بست سیستم یا سایر عملیات تعریف نشده شود. از آنجایی که وقفه های کاذب عمدتاً یک مشکل مدارهای قطع سیمی یا سیمی هستند، تمرین خوب برنامه نویسی در چنین سیستم هایی این است که ISR همه منابع وقفه را برای فعالیت بررسی کند و در صورتی که هیچ یک از منابع قطع نمی کند، هیچ اقدامی (به غیر از احتمالاً ثبت رویداد) انجام ندهد.
وقفه های نرم افزاری
یک وقفه نرم افزاری توسط خود پردازنده با اجرای دستورالعمل های خاص یا زمانی که شرایط خاصی برآورده می شود درخواست می شود. هر سیگنال وقفه نرم افزاری با یک کنترل کننده وقفه خاص مرتبط است.
یک وقفه نرم افزاری ممکن است عمداً با اجرای یک دستورالعمل خاص ایجاد شود که با طراحی، هنگام اجرا یک وقفه را فراخوانی می کند. چنین دستورالعملهایی مانند تماسهای زیر روال عمل میکنند و برای اهداف مختلفی مانند درخواست خدمات سیستم عامل و تعامل با درایورهای دستگاه (مانند خواندن یا نوشتن رسانه ذخیرهسازی) استفاده میشوند. وقفههای نرمافزاری ممکن است توسط خطاهای اجرای برنامه یا سیستم حافظه مجازی نیز ایجاد شوند.
به طور معمول، هسته سیستم عامل چنین وقفه هایی را می گیرد و مدیریت می کند. برخی از وقفه ها به طور شفاف برای برنامه مدیریت می شوند - به عنوان مثال، وضوح عادی یک خطای صفحه این است که صفحه مورد نیاز در حافظه فیزیکی قابل دسترسی باشد. اما در موارد دیگر مانند خطای بخش بندی، سیستم عامل یک فراخوانی فرآیند را اجرا می کند. در سیستمعاملهای شبه یونیکس، این شامل ارسال سیگنالی مانند SIGSEGV، SIGBUS، SIGILL یا SIGFPE است که ممکن است یک کنترلکننده سیگنال را فراخوانی کند یا یک عمل پیشفرض (خاتمه برنامه) را اجرا کند. در ویندوز، تماس برگشتی با استفاده از کنترل استثنای ساختاریافته با کد استثنایی مانند STATUS_ACCESS_VIOLATION یا STATUS_INTEGER_DIVIDE_BY_ZERO انجام می شود.
در یک فرآیند هسته، اغلب این اتفاق می افتد که برخی از انواع وقفه های نرم افزاری قرار نیست اتفاق بیفتد. با این وجود، اگر آنها اتفاق بیفتند، ممکن است سیستم عامل از کار بیفتد.
واژه شناسی
اصطلاحات وقفه، تله، استثنا، خطا و سقط برای تشخیص انواع وقفه ها به کار می روند، اگرچه «هیچ اجماع روشنی به عنوان معنای دقیق این اصطلاحات وجود ندارد». اصطلاح تله ممکن است به هر وقفه، به هر وقفه نرم افزاری، به هر وقفه نرم افزاری همزمان یا فقط به وقفه های ناشی از دستورالعمل هایی با نام تله اشاره کند. در برخی کاربردها، اصطلاح تله به طور خاص به نقطه شکستی اشاره دارد که برای شروع یک سوئیچ زمینه به یک برنامه مانیتور یا اشکال زدا در نظر گرفته شده است. همچنین ممکن است به یک وقفه همزمان ناشی از یک شرایط استثنایی اشاره داشته باشد (به عنوان مثال، تقسیم بر صفر، دسترسی نامعتبر به حافظه، کد عملیات غیرقانونی)، اگرچه اصطلاح استثنا برای این مورد رایجتر است.
x86 وقفهها را به وقفههای (سختافزاری) و استثناهای نرمافزاری تقسیم میکند و سه نوع استثنا را شناسایی میکند: خطاها، تلهها و سقطها. وقفههای (سختافزاری) وقفههایی هستند که بهطور ناهمزمان توسط یک دستگاه ورودی/خروجی راهاندازی میشوند و اجازه میدهند برنامه بدون از دست دادن تداوم راهاندازی مجدد شود. یک خطا نیز قابل راه اندازی مجدد است اما با اجرای همزمان یک دستورالعمل مرتبط است - آدرس برگشتی به دستورالعمل خطا اشاره می کند. یک تله شبیه یک خطا است با این تفاوت که آدرس برگشتی به دستورالعملی اشاره میکند که باید بعد از دستور تلهگذاری اجرا شود؛ یکی از کاربردهای برجسته اجرای فراخوانهای سیستمی است. Abort برای خطاهای شدید، مانند خطاهای سخت افزاری و مقادیر غیرقانونی در جداول سیستم استفاده می شود، و اغلب اجازه راه اندازی مجدد برنامه را نمی دهد.
ARM از اصطلاح استثنا برای اشاره به انواع وقفه ها استفاده می کند، و استثناها را به وقفه های (سخت افزاری)، سقط، بازنشانی و دستورالعمل های ایجاد استثنا تقسیم می کند. سقطها با استثناهای x86 مطابقت دارند و ممکن است سقطهای پیش واکشی (واکشی دستورات ناموفق) یا سقطهای داده (دسترسیهای ناموفق به داده) و ممکن است همزمان یا ناهمزمان باشند. سقط های ناهمزمان ممکن است دقیق یا نادقیق باشند. لغو MMU (اشکال صفحه) همزمان هستند.
منابع
wikipedia.org
isaaccomputerscience.org