2016-01-22 12 views
5

सिस्टम प्रारंभिकरण या स्टार्टअप कोड स्तर पर सभी इंटरप्ट को अक्षम करने की आवश्यकता क्या है। अगर मैं इंटरप्ट को अक्षम नहीं करता तो क्या होगा ??सिस्टम स्टार्टअप या सिस्टम प्रारंभिकरण पर हमें सभी इंटरप्ट को अक्षम करने की आवश्यकता क्यों है?

+5

आपको इसलिए करना होगा क्योंकि आपके इंटरप्ट हैंडलर अभी तक स्थापित नहीं हैं। यदि आप उन्हें अक्षम नहीं करते हैं और आपको कोई बाधा आती है, तो सिस्टम/स्टार्टअप क्रैश हो जाएगा। –

+3

आप संबंधित हैंडलर स्थापित करने से पहले इंटरप्ट को आग लगाना नहीं चाहते हैं, और हैंडलर का उपयोग करने वाले सभी डेटास्ट्रक्चर प्रारंभ किए गए हैं। अन्यथा आपको अप्रत्याशित व्यवहार नहीं मिल सकता है। –

+1

यदि आप एक वास्तविक मोड ओएस लिख रहे हैं तो इंटरप्ट अक्षम करने की आवश्यकता नहीं हो सकती है।प्रश्न में BIOS/हार्डवेयर के लिए डिफ़ॉल्ट वास्तविक मोड इंटरप्ट तालिका होगी। यदि आप संरक्षित मोड ओएस बनाने का इरादा रखते हैं, तो आपको सुरक्षित मोड में स्विच करने से पहले इंटरप्ट को अक्षम करने की आवश्यकता होगी। यदि आप इंटरप्ट के साथ संरक्षित मोड में स्विच करते हैं और कोई इंटरप्ट वेक्टर टेबल (आईवीटी) नहीं है तो यह ट्रिपल गलती होगी। एक बार संरक्षित मोड में, आप एक आईवीटी सेट अप कर सकते हैं, और फिर इंटरप्ट को फिर से सक्षम कर सकते हैं। –

उत्तर

6

कुछ स्थितियों में बाधाएं अवांछित हैं, इसलिए वे अक्षम हैं।
उदाहरण कई हैं लेकिन मेरे सिर के ऊपर से मैं इन के साथ आ सकते हैं:

  • ss:(e)spका संशोधन। यदि कोई बाधा निकाल दी जाती है, तो flags रजिस्टर स्टैक पर धकेल दिया जाता है। एक अमान्य स्टैक मान उस प्रतिलिपि को कुछ यादृच्छिक स्थान पर ले जायेगा। ss:(e)sp बदलना परमाणु नहीं है, कम से कम x86 पर, क्योंकि इसमें कई निर्देश होते हैं, इसलिए बीच में एक बाधा आ सकती है।
    हालांकि, अगर आप अपना कोड सही तरीके से लिखते हैं, तो आप यहां पर इंटरप्ट्स को अक्षम किए बिना एक ही परमाणुता प्राप्त कर सकते हैं क्योंकि वे automatically disabled on certain occasions हैं।

    @MichaelPetch 8088 प्रोसेसर (8086, पहले 86 प्रोसेसर की "कमजोर भाई"), इन के लिए एक अपवाद चित्रण के बारे में कुछ विशेषता बोला "कुछ अवसरों," इस जवाब देने के लिए टिप्पणी में:

    यही सच है के बारे में बीच में आता है अगले निर्देश के अंत तक बंद कर दिया जा रहा है (SS में कोई मान जाने के बाद), लेकिन वहाँ एक बग जहां बीच में आता है ठीक से एक SS परिवर्तन के बाद बंद नहीं किया गया साथ 8088 प्रोसेसर थे। हम में से (डायनासोर) अक्सर CLI/STI SS:SP के आसपास अपडेट करते हैं (इस तरह की एक बग के साथ 8088 सिस्टम चलाने की संभावना शून्य के करीब होने की संभावना है)। एक ऐतिहासिक परिप्रेक्ष्य से, यह PC mag article इस प्राचीन समस्या पर कुछ प्रकाश डाल सकता है।

    (कोड formatters गयी।)

  • एक IDT/IVT का अभाव। जबकि संरक्षित मोड आईडीटी प्रारंभ किया गया है या 16-बिट रीयल मोड आईवीटी संशोधित (या शून्य या कुछ) संशोधित है, तो एक इंटरप्ट कुछ स्मृति स्थान पर कूद जाएगा, कोई निर्देश नहीं स्थित है।

सामान्य रूप से, आप कह सकते हैं कि कुछ गैर-परमाणु तरीके से आईडीटी/आईवीटी को संशोधित करने वाले संचालन में इंटरप्ट अक्षम करने की आवश्यकता है।


एक अलग रूप में के रूप में: मैं अपने आप को पहले से ही कई bootloaders लिखा है और आम तौर पर बूटलोडर के पूरे क्रम के दौरान बीच में आता है अक्षम करें। संरक्षित मोड में, मैं अंततः उन्हें पुन: सक्षम करता हूं। लिनक्स 4.2 इसी तरह से संभालता है। यदि आप रुचि रखते हैं, तो इसके स्रोत कोड (/arch/x86/boot/) या मिनिक्स से पढ़ें!

+1

असल में x86 पर किसी विशेष नियम के कारण पहले मामले में इंटरप्ट को अक्षम करने की आवश्यकता नहीं है: 'पॉप% ss' के बाद एक चक्र के लिए इंटरप्ट अक्षम हैं ताकि आपके पास स्टैक पॉइंटर सेट करने का समय हो। – fuz

+0

@FUZxxl हो गया। क्या आप इसे देख सकते हैं, कृपया? – Downvoter

+0

यह सही है लेकिन सावधान रहें, जब आप पंक्ति में कई ऐसे निर्देश निष्पादित करते हैं तो सूक्ष्म व्यवहार होता है। – fuz

संबंधित मुद्दे