ورود

View Full Version : non-maskable اینتراپت



zoncpp
پنج شنبه 25 مرداد 1386, 11:52 صبح
سلام،
اینتراپت non-maskable باعث غیرفعال شدن بعضی اینتراپت ها میشه (ولی دقیقا نمی دونم کدوم اینتراپت ها. ؟؟؟؟)
حالا اگر من در برنامم بتونم این اینتراپت (non-maskable) رو فعال کنم ، و بلافاصله غیر فعالش کنم ، آیا برنامه با مشکل مواجه می شه؟ یا اجرای برنامه ادامه پیدا می کنه؟

من در مورد non-maskable یعنی همان NMI اطلاع زیادی ندارم، و تازه مطالعه در این زمینه رو شروع کردم، در مطالبم اگر اشتباهی هست بگید، مرسی:خجالت:

shaniaki
پنج شنبه 25 مرداد 1386, 22:46 عصر
با عرض ادب:
هنگامی که وقفه ای فعال می شود پیش از آنکه پردازنده را وادار کند که کنترل برنامه را به روتین سرویس وقفه منتقل کند از فیلتر (Mask)ی عبور می کند که این ماسک توسط کاربر برنامه نویس قابل تنظیم است. اما در پردازنده ها معمولا وقفه یا وقفه هایی وجود دارند که همواره در صورت فعال شدن اعمال می شوند و قابل ماسک کردن و نادیده انگاشتن نیستند. این دسته وقفه ها را non-maskable می گویند. تا جایی که من می دانم این وقفه همواره وجود دارد و مانعی برای دیگر وقفه ها نیست اما این امکان وجود دارد که در روتین سرویس NMI دیگر وقفه های سیستم موقتا غیر فعال شده باشند (nested interrupt نداشته باشیم).

یه ... ...

zoncpp
شنبه 27 مرداد 1386, 09:25 صبح
که این ماسک توسط کاربر برنامه نویس قابل تنظیم است.

من چطور می تونم یک اینتراپت رو ماسک کنم، در برنامم، به طوری که برنامم دچار مشکل نشه.
آیا نمونه کدی وجود داره؟ برای راهنماییم.

shaniaki
شنبه 27 مرداد 1386, 10:57 صبح
با عرض ادب:

http://maven.smith.edu/~thiebaut/ArtOfAssembly/CH17/CH17-3.html


The interrupt mask register is an eight bit register that lets you individually enable and disable interrupts from devices on the system.
This is similar to the actions of the cli and sti instructions, but on a device by device basis.
Writing a zero to the corresponding bit enables that device's interrupts. Writing a one disables interrupts from the affected device.

یه ... ...

zoncpp
شنبه 27 مرداد 1386, 12:15 عصر
Writing a one disables interrupts from the affected device.
این کار در ویندوزXP انجام میشه؟ احتمالا توسط درایور؟ مثالی وجود داره؟ مرسی

illegalyasync
دوشنبه 29 مرداد 1386, 01:23 صبح
NMI یه concept هستش . وقتی بخوای ماشین و سیستم عامل رو تئوری یاد بگیری ازش استفاده میشه . برای کاری که دنبالش هستی دستکاری کردن idt بهترین روشه اما قطعا انتی ویروسها بهت گیر میدن . تو همون تاپیک توضیح دادم.....اگه دقیق مینوشتی چیکار میخوای انجام بدی شاید بهتر میشد راهنمائی کرد....

Inprise
جمعه 02 شهریور 1386, 15:10 عصر
NMI یه concept هستش . وقتی بخوای ماشین و سیستم عامل رو تئوری یاد بگیری ازش استفاده میشهیه مفهوم هست ، ولی معادل ملموس هم داره !
بسته به معماری پردازنده ، معمولا تعدادی Interrupt Line وجود داره که بصورت ــ غیر دقیق ــ همزمان Interrupt ها رو وارد Pipe [ها] میکنند ، و معمولا" حداقل یکی از این Line ها مختص NMI هست . مثلا x86 ها حداقل دو تا Interrupt Line دارن که لزوما" حداقل یکیش مختص NMI است . مثلا حتما دیدی یا خوندی که اگر بخواهند کدی نزدیک به وضعیت Real Time اجرا بشه اون رو در حالتی اجرا میکنن که هیچ وقفه ای نتونه فعال بشه ــ و پیش بینی رو مخدوش کنه ــ مثلا روی ویندوز IRQL HIGH_LEVEL دارای همین شرایط است و اگر درایور در این سطح اجرا بشه هیچ وقفه ای رو تجربه نمیکنه ، مگر NMI ها رو .

مهمترین کاربرد NMI ها انتقال خطا های فوق العاده ضروری است و معمولا ( کاملا به معماری پردازنده و چیپ اصلی و مادربرد بستگی داره ) کنترلرهای جدی ای مثل Memory Controller وقتی حالشون خوب نباشه NMI تولید میکنن ، و هیچ کدی اجرای Callback routine های NMI رو به تاخیر نمیندازه ، یا متوقف نمیکنه . این مسئله هم مزیت اجرائی داره و هم مزیت امنیتی . وجود NMI به دلیل اجرائی ضروری است چون بقول معروف همیشه باید یک هات لاین به عنوان آخرین روش ارسال پیام وجود داشته باشه ، و هم مزیت امنیتی داره چون حتی سطح پائین ترین کد هم نمیتونه عملکرد غیر صحیح یک سخت افزار رو مخفی کنه تا نهایتا به از بین رفتن کل ماشین منجر بشه ، یا مواردی مثل همین .


در نتیجه


اینتراپت non-maskable باعث غیرفعال شدن بعضی اینتراپت ها میشه (ولی دقیقا نمی دونم کدوم اینتراپت ها. ؟؟؟؟) اینطور نیست .




حالا اگر من در برنامم بتونم این اینتراپت (non-maskable) رو فعال کنم ، و بلافاصله غیر فعالش کنم ، آیا برنامه با مشکل مواجه می شه؟ یا اجرای برنامه ادامه پیدا می کنه؟نمیتونی NMI رو غیر فعال کنی . این یه امکان سخت افزاری است . اما شاید بشه روتینهای جوابگوئی به NMI ها رو شناسائی و غیر فعال کنی ، که در عمل باز هم غیر ممکنه چون مثلا ساب-سیستم حافظه ویندوز از NMI بصورت جدی استفاده میکنه ، و Patch‌ کردنش هم شوخی به نظر میرسه .

در کل NMI برای مقصودی که داری یه مطلب کاملا بی ربط است .

zoncpp
دوشنبه 05 شهریور 1386, 11:08 صبح
نمیتونی NMI رو غیر فعال کنی . این یه امکان سخت افزاری است . اما شاید بشه روتینهای جوابگوئی به NMI ها رو شناسائی و غیر فعال کنی ، که در عمل باز هم غیر ممکنه چون مثلا ساب-سیستم حافظه ویندوز از NMI بصورت جدی استفاده میکنه ، و Patch‌ کردنش هم شوخی به نظر میرسه .
یکی به من گفت این کار می شه، حدس من اینه که منظور اون انجام این کار در سیستم عامل Dos بوده، آیا این طور هست که در Dos بشه سخت افزاری NMI رو غیر فعال کرد؟

illegalyasync
جمعه 09 شهریور 1386, 13:36 عصر
آقا من الان به این نتیجه رسیدم که میشه سایت برنامه نویسو جدی گرفت ;)