2012-07-09 16 views
6

क्या सीपीयू इंटरप्ट हैंडलर को कॉल करने से पहले स्थानीय सीपीयू पर सभी इंटरप्ट को अक्षम करता है? या क्या यह केवल उस विशेष इंटरप्ट लाइन को अक्षम करता है, जिसे परोसा जा रहा है?क्या एक इंटरप्ट हैंडलर को एक ही इंटरप्ट हैंडलर द्वारा छूट दी जा सकती है?

+1

कौन सी सीपीयू? क्या वास्तुकला? – eepp

+0

x86 आर्किटेक्चर। – Harman

उत्तर

3

86 व्यवधान वेक्टर के कूदने से पहले सभी स्थानीय बीच में आता है (बेशक एनएमआई को छोड़कर) अक्षम करता है। लिनक्स सामान्य रूप से विशिष्ट बाधा को मुखौटा करता है और बाकी इंटरप्ट्स (जिन्हें मास्क नहीं किया जाता है) को फिर से सक्षम करता है, जब तक कि एक विशिष्ट झंडे इंटरप्ट हैंडलर पंजीकरण में पास नहीं हो जाते हैं।

ध्यान दें कि इसका मतलब है, जबकि अपनी व्यवधान हैंडलर ही CPU पर खुद के साथ दौड़ नहीं होगा, यह और अपने आप में एक SMP/श्रीमती मंडल के अन्य सीपीयू पर चलने के साथ दौड़ होगी।

+0

क्या आप दावे को स्रोत प्रदान कर सकते हैं "x86 सभी स्थानीय इंटरप्ट्स को अक्षम करता है .. इंटरप्ट वेक्टर पर कूदने से पहले"? मेरे इंटेल से इंटेल 3-वॉल्यूम आर्किटेक्चर प्रलेखन, और 825 9 ए दस्तावेज, मेरे पॉज़ेशन में है। मुझे कुछ भी नहीं मिल रहा है कि इंटरप्ट को वेक्टर को बाधित करने से पहले स्वचालित रूप से अक्षम कर दिया जाता है, यानी एक आईएसआर (इंटरप्ट सेवा रूटीन/इंटरप्ट हैंडलर प्रक्रिया) में प्रवेश करने के बिंदु पर – amn

+2

सख्त एचडब्ल्यू व्यवहार नहीं - प्रश्न के संदर्भ में सवाल पूछा गया था लिनक्स कर्नेल। एलएपीआईसी व्यवहार प्रोग्राम करने योग्य है, लेकिन इस तरह लिनक्स प्रोग्राम करता है - सभी प्राथमिकता के सभी बाधाओं में से एक है, इसलिए एक दूसरे को अवरुद्ध करता है, लेकिन सॉफ़्टवेयर में लिनक्स हस्तक्षेप हैंडलर चलाने से पहले भी जल्दी से इंटरप्ट को सक्षम बनाता है। – gby

+0

बाद में मैंने "इंटेल 64 और आईए -32 आर्क। सॉफ्टवेयर डेवलपर मैनुअल" में प्रश्न में "डिफ़ॉल्ट" x86 एचडब्ल्यू व्यवहार का संदर्भ पाया, पी। 6-10 वॉल्यूम 1: "अगर किसी इंटरप्ट या अपवाद हैंडलर को को एक इंटरप्ट गेट के माध्यम से बुलाया जाता है, तो प्रोसेसर को हैंडलर के निष्पादन में हस्तक्षेप करने के बाद के इंटरप्ट को रोकने के लिए EFLAGS रजिस्टर में इंटरप्ट सक्षम (IF) ध्वज को साफ़ करता है।" लिनक्स के संबंध में चीजों को साफ़ करने के लिए धन्यवाद। – amn

2

आम तौर पर (कम से कम 86 में), एक अवरोध बीच में आता है अक्षम करता है।

जब कोई बाधा प्राप्त होती है, तो हार्डवेयर इन चीजों को करता है:
1. सभी रजिस्टरों को पूर्व निर्धारित स्थान पर सहेजें।
2. हस्तक्षेप हैंडलर के पते पर निर्देश सूचक (AKA प्रोग्राम काउंटर) सेट करें।
3. वह रजिस्टर सेट करें जो किसी ऐसे मान पर इंटरप्ट करता है जो सभी (या अधिकतर) इंटरप्ट को अक्षम करता है। यह इस में बाधा डालने से एक और बाधा रोकता है।

एक अपवाद एनएमआई (गैर मास्केवल एंटरप्ट) जो निष्क्रिय नहीं किया जा सकता है।

+4

लिनक्स कर्नेल डेवलपमेंट ** लिनक्स में इंटरप्ट हैंडलर को पुनर्वित्त की आवश्यकता नहीं है। जब एक दिया गया इंटरप्ट हैंडलर निष्पादित हो रहा है, तो संबंधित प्रोसेप्ट लाइन को सभी प्रोसेसर पर मुखौटा किया जाता है, जिससे प्राप्त होने से एक ही लाइन पर एक और बाधा आती है। आम तौर पर अन्य सभी इंटरप्ट सक्षम होते हैं, इसलिए अन्य इंटरप्ट्स की सेवा की जाती है, लेकिन वर्तमान पंक्ति हमेशा अक्षम होती है। नतीजतन, एक ही इंटरप्ट हैंडलर को घोंसला वाले अंतराल की सेवा के लिए समवर्ती रूप से कभी नहीं बुलाया जाता है। यह आपके इंटरप्ट हैंडलर को लिखने में बहुत सरल बनाता है। ** तो, केवल वर्तमान इंटरप्ट लाइन को मुखौटा किया गया है। – Harman

+0

@ हार्मन, इसका मतलब है कि केवल वर्तमान इंटरप्ट लाइन को मुखौटा होने की गारंटी है। मुझे पूरा यकीन है कि x86 पर वास्तविक कार्यान्वयन उन सभी को मुखौटा करना है। – ugoren

1

हाँ, यह ठीक है। मैं जो भी सोचता हूं वह प्रासंगिक भी हो सकता है।

कई वास्तविक दुनिया ड्राइवरों/कर्नेल कोड में, "नीचे से डेढ़" (बिहार) संचालकों सुंदर often- tasklets softirqs किया जाता है। ये बीएच इंटरप्ट संदर्भ में चलाए गए हैं और एसएमपी (एसएसपी सॉफ्टिर्क) पर अपने शीर्ष-आधे (वें) हैंडलर के साथ समानांतर में चल सकते हैं।

बेशक, हाल ही में मुख्य रूप से एक कदम (मुख्य रूप से PREEMPT_RT प्रोजेक्ट से माइग्रेट किया गया कोड) है, जो अनिवार्य रूप से 'बीएच' तंत्र से छुटकारा पाता है- सभी इंटरप्ट हैंडलर सभी इंटरप्ट अक्षम किए जाते हैं। इतना ही नहीं, हैंडलर कर्नेल थ्रेड में परिवर्तित (हो सकते हैं) हैं- ये तथाकथित "थ्रेडेड" इंटरप्ट हैंडलर हैं।

आज के रूप में, विकल्प अभी भी developer- आप 'पारंपरिक वें/bh शैली या थ्रेडेड शैली का उपयोग कर सकते करने के लिए छोड़ दिया है।

रेफरी और विवरण:

http://lwn.net/Articles/380931/

http://lwn.net/Articles/302043/

0

का हवाला देते हुए इंटेल के मालिक हैं, आश्चर्यजनक रूप से अच्छी तरह से लिखा "इंटेल 64 और IA-32 आर्किटेक्चर सॉफ्टवेयर डेवलपर की मैनुअल", खंड 1, पृष्ठों 6-10:

तो व्यवधान या अपवाद संचालक के माध्यम से कहा जाता है एक इंटरप्ट गेट, प्रोसेसर को हैंडलर के निष्पादन के साथ हस्तक्षेप करने के बाद के इंटरप्ट को रोकने के लिए EFLAGS रजिस्टर में इंटरप्ट सक्षम (IF) ध्वज को साफ़ करता है। जब एक हैंडलर को जाल द्वार के माध्यम से बुलाया जाता है, तो आईएफ ध्वज की स्थिति नहीं बदली जाती है।

तो बस स्पष्ट होने के लिए - हाँ, प्रभावी रूप से सीपीयू इंटरप्ट हैंडलर को कॉल करने से पहले सभी इंटरप्ट्स को "अक्षम" करता है।उचित रूप से वर्णित, प्रोसेसर बस एक झंडा ट्रिगर करता है जो इसे सभी इंटरप्ट अनुरोधों को अनदेखा करता है। शायद गैर-मुखौटा इंटरप्ट्स और/या अपने स्वयं के सॉफ़्टवेयर अपवादों को छोड़कर (कृपया कोई मुझे इस पर सही करें, सत्यापित नहीं)।

0

हम चाहते हैं कि आईएसआर परमाणु हो और कोई भी आईएसआर को मुक्त करने में सक्षम नहीं होना चाहिए।

इसलिए, एक आईएसआर स्थानीय इंटरप्ट्स (यानी वर्तमान प्रोसेसर पर बाधा) को अक्षम करता है और एक बार आईएसआर ret_from_intr() फ़ंक्शन को कॉल करता है (यानी हमने आईएसआर समाप्त कर लिया है), वर्तमान प्रोसेसर पर इंटरप्ट को फिर से सक्षम किया जाता है।

यदि कोई बाधा उत्पन्न होती है, तो अब इसे अन्य प्रोसेसर (एसएमपी सिस्टम में) द्वारा सेवा दी जाएगी और उस इंटरप्ट से संबंधित आईएसआर चलना शुरू हो जाएगा।

एसएमपी सिस्टम में, हमें एक आईएसआर में उचित सिंक्रनाइज़ेशन तंत्र (स्पिन लॉक) भी शामिल करने की आवश्यकता है।

+1

क्या आप अपने समाधान को आपके द्वारा प्रदान किए गए समाधान के बारे में थोड़ा और विवरण जोड़कर विस्तारित कर सकते हैं? – abarisone