X
تبلیغات
آموزش کامپیوتر - اینتراپت یا وقفه چیست؟

همانطوریکه در بحث مقدماتی ذکر شد، هدف از این مبحث تاکیدبر این نوع نگرش است که ارتباط ریزپردازنده با دستگاهای I/O مشابه روش متداول ارتباط با حافظه نیست و الزاما نیازمند روش دیگری است، که آن روش را وقفه نامیدیم.

وقفه، همانطوریکه از نامش پیداست، روشی است که در اجرای برنامه عادی و جاری ریزپردازنده وقفه به وجود می آورد و آن را بصورت موقت قطع می کند تا ریزپردازنده اقدام به اجرای یک برنامه دیگر نموده و پس از اتمام آن، کنترل اجرای برنامه توسط ریزپردازنده، مجددا" به برنامه ایی که قطع شده برگشته و اجرای آن را ادامه دهد. بنابراین مفهوم وقفه به هیچ وجه به معنی توقف کار ریزپردازنده نیست بلکه وقفه صرفا قطع برنامه جاری و رفتن به اجرای یک برنامه دیگر است.

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

مثال هایی از انواع وقفه ها

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

 - وقفه های زمان سنج (Timer) این وقفه به سیستم عامل امکان می دهد بعضی اعمال را  به صورت مرتب در یک پریودهای خاص زمانی انجام دهد. مثل تنظیم ساعت ، یا چک کردن سخت افزار و ...

-  وقفه های I/O این وقفه ها به وسیله کنترل کننده دستگاههای I/O تولید می شوند تا کامل شدن طبیعی اجرای یک برنامه (اتمام یک عمل توسط I/O مربوطه) و  یا احیانا بروز خطا در حین اجرای آن عمل را نشان دهند.

-وقفه های نقص سخت افزار یا وقفه های (Machine Check) مثل وقفه ای که در اثر بروز خطای توازن رخ می دهد، یا وقفه ی نقص تغذیه سیستم.

-  وقفه (Super Visor Call) که در واقع یک تقاضا از طرف برنامه کاربر جهت دریافت سرویس ویژه ای از سیستم عامل  است.

انواع وقفه

256 سطح الويت توسط پردازنده های 80x86 پشتيبانی می شود که می توان آنها را به سه گروه کلی تقسيم کرد:

وقفه های داخلی سخت افزاری

وقفه های خارجی سخت افزاری

وقفه های نرم افزاری

 

وقفه های داخلی سخت افزاری

وقفه های داخلی سخت افزاری (internal hardware-interrupts) بدليل رخ دادن وضعيت معينی که درحين اجرای يک برنامه پيش آمده توليد می شوند(مانند تقسيم بر صفر). وقفه هايی که در اثر خطا بوجود می آيد تله (trap) هم ناميده می شود. تله باعث سقط برنامه می شوند.

اين وقفه ها توسط سخت افزار اداره می شوند و امکان تغيير آنها وجود ندارد. اما با وجوديکه نمی توان آنها را مستقيما مديريت کرد، اين امکان وجود دارد که از اثر آن روی کامپيوتر به نحو مفيدی استفاده شود.

مثال. سخت افزار وقفه شمارنده ساعت کامپيوتر را چندبار در ثانيه فراخوانی می کند تا زمان را نگه دارد. می توان برنامه ای نوشت که مقدار شمارنده ساعت را خوانده آنرا به شکل قابل درک کاربر به صورت ساعت و دقيقه تبديل کند.

وقفه های خارجی سخت افزاری

وقفه های خارجی سخت افزاری (external hardware-interrupts) خارج از CPU و توسط دستگاه های جانبی ، مانند صفحه کليد، چاپگر، کارت های ارتباطی و يا کمک پردازنده توليد می شوند. دستگاه های جانبی با ارسال وقفه به CPU خواستار قطع اجرای برنامه فعلی شده و CPU را متوجه خود می کنند. آنها به پايه (maskable interrupts) INTR يا (non maskable interrupts) NMI پردازنده متصل هستند.

وقفه های دستگاه ها می توانند از طريق مداری به نام PIC 8259A، که کارش منحصرا سروکار داشتن با اين نوع وقفه هاست، به پردازنده ارسال شوند. مدار (programmable interrupt controller) PIC که توسط CPU کنترل می شود سيگنال هايش را روی پايه INTR قرار می دهد و امکان فعال و غيرفعال کردن وقفه ها و تغيير سطح الويت را تحت نظارت يک برنامه می دهد.

دستورات STI و CLI می توانند برای فعال و غيرفعال کردن وقفه هایی که روی پايه INTR ارسال می شوند بکار روند که البته روی وقفه های NMI تاثيری ندارد.

وقفه های نرم افزاری

وقفه های نرم افزاری (software interruptions) در نتيجه دستورالعمل int در يک برنامه درحال اجرا توليد می شوند.

برنامه نويس می تواند با دادن دستور int يک وقفه نرم افزاری توليد کند. بدين طريق بلافاصله اجرای برنامه فعلی را متوقف می کند و CPU را به روتين وقفه هدايت می کند. برنامه نويس از طريق وقفه ها می تواند در برنامه با وسايل جانبی ارتباط برقرار کند. استفاده از وقفه ها باعث کوتاهتر شدن کد برنامه و درک آسانتر و اجرای بهترآن می شود.

روتين های وقفه نرم افزاری بخشی از سيستم عامل هستند. از اينرو وقفه های نرم افزاری را می توان به دو گروه تقسيم کرد؛ وقفه های سيستم عامل DOS و وقفه های BIOS. وقفه های DOS آسانتر استفاده می شوند اما از وقفه های BIOS که قسمتی از سخت افزار هستند کندتر هستند. DOS  اين نوع وقفه ها را برای اجرای (application programming interface) API خودش استفاده می کند. بيشتر سيستم عامل های جديد مانند Windows و Unix واسطه C-based را استفاده می کنند.

INT

دستورالعمل (interrupt) int يک روتين وقفه را فراخوانی می کند. فرم کلی آن به صورت زير است:

int n

n شماره وقفه موردنظر و مقداری بين 0 تا 255 است که اجازه فراخوانی 256 روتين مختلف وقفه را می دهد.

دستورالعمل int يک فراخوانی سيستمی را می سازد و شکل خاصی از دستورالعمل فراخوانی يک زيربرنامه (دستورالعمل call) است.

مشکل دستورالعمل int اين است که تنها 256 روتين وقفه را می تواند پشتيبانی کند. درحاليکه DOS به تنهايی دارای بيش از 100 سرويس مختلف وقفه و BIOS بيش از هزاران سرويس وقفه است. که اين تعداد بيش از کليه وقفه هايی است که توسط اينتل رزرو شده است. برای حل اين مشکل از يک شماره وقفه برای هر دسته از سرويس های وقفه و يک شماره تابع برای تعيين سرويس موردنظر استفاه می شود. شماره تابع توسط يکی از ثبات ها (اکثرا AH) هنگام فراخوانی وقفه ارسال به روتين وقفه می شود.

مثال. سيستم عامل DOS شماره وقفه 21h را بکار می گيرد. برای انتخاب يک تابع خاص، قبل از فراخوانی وقفه، کد تابع در ثبات AH قرار می گيرد. برای نمونه تابع 4Ch اين وقفه برای خاتمه برنامه و برگشت به محيط DOS فراخوانی می شود.

movAH,4Chint21h

جدول بردار وقفه

هر سطح وقفه يک محل رزرو شده در حافظه دارد که بردار وقفه (interrupt vector) ناميده می شود. همه بردارهای وقفه در جدولی به نام جدول بردار وقفه (interrupt vector table) نگهداری می شوند. اين جدول از ابتدای حافظه اصلی يعنی آدرس 0000:0000 ذخيره شده است. هر بردار وقفه 4 بايت طول دارد. دوبايت بالای آن آفست و دو بايت پايين آن سگمنت روتين وقفه را دربر می گيرند. چون 256 روتين های وقفه وجود دارد بنابراين اندازه جدول بردار وقفه 256×4=1024=1KB است.

شماره وقفه به عنوان انديسی برای جدول بردار وقفه استفاده می شود. آفست روتين وقفه شماره n در آدرس n×4 و آدرس سگمنت روتين وقفه شماره n در آدرس n×4+2 جدول قرار دارد.

يک ويژگی خوب اين سيستم اين است که می توان بردارها را برای اشاره به روتين ديگری تغيير داد. که اين همان کاری است که برنامه های TSR (Terminate and Stay Resident) انجام می دهند.

در برنامه هميشه توسط شماره وقفه به يک روتين وقفه مراجعه می شود بنابراين برنامه نيازی به دانستن آدرس واقعی در حافظه ندارد و آدرس روتين وقفه هنگام اجرا توسط CPU تعيين می شود.

مثال. آدرس های آفست و سگمنت روتين وقفه شماره 5 برابر با 5×4=0014h و 5×4+2=0016h می باشد.

دسته بندی وقفه ها

به صورت خیلی کلی می توان وقفه ها را به سه دسته اساسی تقسیم کرد:

وقفه های داخلی : وقفه هایی است که در اثر اجرای دستورات در ریزپردازنده رخ می دهد (مثل وقفه تقسیم بر صفر.

وقفه های خارجی : وقفه هایی است که در اثر وقوع یک اتفاق خارجی و از طرف دستگاههای سخت افزاری خارج از ریزپردازنده به وجود می آید.

وقفه های نرم افزاری : وقفه هایی است که در اثر فراخوانی توابع سیستمی توسط برنامه رخ می دهد. در بعضی مواقع این نوع وقفه ها را در همان دسته بندی وقفه های داخلی قرار می دهند.وقفه های نرم افزاری در اثر اجرای مجدد برنامه، دوباره به همان صورت قبلی رخ خواهد داد. در صورتی که وقفه های خارجی مستقل از دستورات برنامه است و ناهمگام با برنامه بوده و در اثر یک اتقاق خارجی رخ می دهد

وقفه‌ها جزء مهمی ازمعماری کامپیوتر هستندونحوه عملکردآنها ازماشینی به ماشین دیگر ممکن است متفاوت باشد. وقفه راهکاری را فراهم می‌سازد تا اجرای دستورالعملهای جاری پردازنده موقتاً متوقف شده و دستورات سرویس دهی دیگری اجراء گردد و سپس از آن کنترل دوباره به برنامه وقفه داده شده باز گردد.

انواع وقفه‌ها را می‌توان به صورت زیر دسته بندی کرد:

  • 1.وقفه‌های برنامه (یاprogram check) که به دلیل اجرای بعضی دستورات رخ می‌دهند. مثلاً سرریز شدن محاسباتی تقسیم بر صفر, اجراء دستورالعمل غیر مجاز, رجوع به آدرس خرج از محدوده مجاز کاربر. به این وقفه‌ها اغلب Trap یا تله گفته می‌شود.
  • 2.وقفه‌های زمان سنج(Timer) این وقفه به سیستم عامل امکان می‌دهد بعضی اعمال را به صورت مرتب در یک پریود زمانی خاص انجام دهد (مثل تنظیم ساعت, چک کردن سخت افزار و..).
  • 3.وقفه‌های I/O این وقفه‌ها به وسیله کنترل کننده‌های دستگاه I/O تولید می‌شوند تا کامل شدن طبیعی یک عمل یا بروز خطا در انجام عمل را نشان دهند.
  • 4.وقفه‌های نقص سخت افزار یا وقفه‌های Machine-check) مثل وقفه‌ای که بر اثر خطای بیت توازن (parity) حافظه رخ می‌دهد یا وقفه نقص برق
  • 5.وقفه (Super Visor Call) که در واقع یک تقاضا از طرف برنامه کاربر جهت دریافت سرویس ویژه‌ای از سیستم عالم است .
  • 6.وقفه Restart که با فشار دادن دکمه Reset ایجاد می‌شود .در یک تقسیم بندی کلی می‌توان وقفه‌های را سه دسته کرد:
  • 1.وقفه‌های داخلی (trap) که بر اثر اجرای دستورات خود برنامه به صورت داخلی در CPU رخ می‌هند.
  • 2.وقفه‌های خارجی که از دستگاههای خارجی مثل دستگاههای ورودی یاخروجی ,DMA,تایمرها , صفحه کلید و خطاهای سخت افزاری ناشی می‌شوند.
  • 3.وقفه‌های نرم افزاری(یاهمان SVC) که بر اثر فراخوانی توابع سیستمی توسط برنامه رخ می‌دهند.
  • با اجرای مجدد برنامه , وقفه‌های داخلی به همان صورت قبلی دوباره رخ می‌دهند ولی وقفه‌های خارجی مستقل از دستورات برنامه و ناهمگام با برنامه می‌باشند.

·       اگر چند منبع همزمان تقاضاهایشان را از طریق یک خط وقفه به CPU اعلام کنند , آنگاه CPU با روش همه پرسی یا سرکشی(polling) منبع وقفه دهنده را تشخیص خواهد داد.)CPU به طور مستقیم تنها با حافظه اصلی (Main Memory) سرو کار دارد و برنامه‌ها جهت اجراء می‌بایست در حافظه اصلی قرار گیرند.سیستم عامل در یک سیستم برنامه‌ای باید مشخص کندهر بخش از حافظه توسط چه پروسسی استفاده شود. تخصیص و باز پس گیری فضاهای حافظه و نیز محافظت از تداخل فرایندها بر یکدیگر از دیگر وظایف سیستم عامل است .از آنجا که حافظه اصلی برای جا دادن تمام برنامه‌های در حال اجراء غالباً کوچک است سیستم عامل بایستی از حافظه ثانویه(Secondary Memory) عموماً هارد دیسک) جهت پشتیبانی حافظه اصلی استفاده کند. به این مفهوم حافظه مجازی گفته می‌شد و مدیریت حافظه مجازی , تخصیص و رهاسازی این حافظه و حفاظت آن از دیگر بحثهای سیستم عامل است .

چند نمونه وقفه متعارف

وقفه 21h

تابع 01h. يک کليد را از صفحه کليد می خواند.کد کليد خوانده شده در ثبات AL برگردانده می شود.

movAH,0lh
int21h
mov AL, character

تابع 02h. يک کاراکتر را روی صفحه نمايش نشان می دهد.کد کاراکتر در ثبات DL بايد قرار داده شود.

movAH02h
movDL,character
int 21h

تابع 09h. يک رشته کاراکتری را روی صفحه نمايش نشان می دهد.آدرس شروع رشته بايد در ثبات های DS:DX قرار بگيرد. انتهای رشته توسط کاراکتر ($) بايد تعيين شده باشد.

movAH,09h
leaDX,string
int 21h

وقفه 10h

تابع 02h. مکان نما را روی صفحه نمايش به سطر و ستون خاصی منتقل می کند.

شماره صفحه در BH، شماره سطر در DH و شماره ستون در DL بايد قرار بگيرد. مختصات صفحه از نقطه 0 و 0 از گوشه بالای چپ صفحه نمايش شروع می شود.

movAH,02h
movBH,page
movDH,row
movDL,column
int 10h

تابع 09h. يک کاراکتر را با رنگ معين چندبار نمايش می دهد. کد کاراکتر در AL، شماره صفحه در BH، خاصيت رنگ کاراکتر در BL و تعداد تکرار کاراکتر در CX بايد قرار بگيرد.

movAH,09h
movAL,character
movBH,page
movBL,attribute
movCX,number
int 10h

 

+ نوشته شده در  چهارشنبه نهم شهریور 1390ساعت 19:20  توسط ziba  |