लिनक्स में एक बाधा को कैसे नियंत्रित किया जाता है?


35

मैं सिर्फ इतना पता है कि Interruptएक है hardware signal assertionएक प्रोसेसर पिन में कारण होता है। लेकिन मैं यह जानना चाहूंगा कि लिनक्स ओएस इसे कैसे संभालता है।
जब कोई व्यवधान होता है तो सभी चीजें क्या होती हैं?


tldp.org/LDP/tlk/dd/interrupts.html यू ने पूछे गए प्रश्न के बारे में सब कुछ समझा दिया है
जॉन

जवाबों:


40

यहां निम्न-स्तरीय प्रसंस्करण का एक उच्च-स्तरीय दृश्य है। मैं एक साधारण ठेठ वास्तुकला का वर्णन कर रहा हूं, वास्तविक आर्किटेक्चर अधिक जटिल हो सकते हैं या उन तरीकों से भिन्न हो सकते हैं जो इस स्तर पर विस्तार से मायने नहीं रखते हैं।

जब कोई व्यवधान उत्पन्न होता है, तो प्रोसेसर दिखता है कि इंटरप्ट को मास्क किया गया है। यदि वे हैं, तो कुछ भी नहीं होता है जब तक कि वे बेदाग न हों। जब व्यवधान बेदाग हो जाते हैं, यदि कोई लंबित व्यवधान होता है, तो प्रोसेसर एक को चुनता है।

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

इंटरप्ट हैंडलर वह करता है, जो आम तौर पर परिधीय के साथ संचार करके होता है, जो डेटा को भेजने या प्राप्त करने के लिए रुकावट को ट्रिगर करता है। यदि बाधा टाइमर द्वारा उठाई गई थी, तो हैंडलर ओएस अनुसूचक को ट्रिगर कर सकता है, एक अलग थ्रेड पर स्विच करने के लिए। जब हैंडलर निष्पादित करना समाप्त कर देता है, तो यह एक विशेष रिटर्न-इन-इंटरप्ट निर्देश को निष्पादित करता है जो सहेजे गए रजिस्टरों को पुनर्स्थापित करता है और अनमास्क को बाधित करता है।

बाधा हैंडलर को जल्दी से चलना चाहिए, क्योंकि यह किसी अन्य रुकावट को चलने से रोक रहा है। लिनक्स कर्नेल में, इंटरप्ट प्रोसेसिंग को दो भागों में विभाजित किया गया है:

  • "शीर्ष आधा" बाधा हैंडलर है। यह न्यूनतम आवश्यक करता है, आमतौर पर हार्डवेयर के साथ संवाद करता है और कर्नेल मेमोरी में कहीं एक झंडा सेट करता है।
  • "नीचे आधा" कोई अन्य आवश्यक प्रसंस्करण करता है, उदाहरण के लिए डेटा को प्रोसेस मेमोरी में कॉपी करना, कर्नेल डेटा संरचनाओं को अपडेट करना, आदि। यह अपना समय ले सकता है और यहां तक ​​कि सिस्टम के किसी अन्य हिस्से के इंतजार में ब्लॉक कर सकता है क्योंकि यह इंटरप्ट के साथ चलता है।

इस विषय पर हमेशा की तरह, अधिक जानकारी के लिए, लिनक्स डिवाइस ड्राइवर्स पढ़ें ; अध्याय 10 इंटरप्ट के बारे में है।


22

गाइल्स ने पहले से ही एक रुकावट के सामान्य मामले का वर्णन किया, निम्नलिखित विशेष रूप से एक इंटेल आर्किटेक्चर पर लिनक्स 2.6 पर लागू होता है (इसका हिस्सा इंटेल के विनिर्देशों पर भी आधारित है)।

एक बाधा एक घटना है जो प्रोसेसर द्वारा निष्पादित निर्देशों के अनुक्रम को बदल देती है।
दो अलग-अलग प्रकार के व्यवधान हैं:

  • निर्देश प्रसंस्करण करते समय सीपीयू द्वारा उत्पादित सिंक्रोनस इंटरप्ट (अपवाद)
  • अन्य हार्डवेयर उपकरणों द्वारा जारी किया गया अतुल्यकालिक व्यवधान (इंटरप्ट)

अपवाद प्रोग्रामिंग त्रुटियों (फे डिवाइड त्रुटि , पृष्ठ दोष , अतिप्रवाह ) के कारण होते हैं जिन्हें कर्नेल द्वारा नियंत्रित किया जाना चाहिए। वह कार्यक्रम को एक संकेत भेजता है और त्रुटि से उबरने का प्रयास करता है।

निम्नलिखित दो अपवादों को वर्गीकृत किया गया है:

  • एक अज्ञात स्थिति का पता लगाने के दौरान सीपीयू द्वारा उत्पन्न प्रोसेसर-अपवादित अपवाद ; तीन समूहों में विभाजित: दोष आम तौर पर सुधारा जा सकता है, जाल एक निष्पादन रिपोर्ट, रोकता गंभीर त्रुटियाँ हैं।
  • प्रोग्रामर द्वारा अनुरोध किए गए अपवाद अपवाद , एक जाल की तरह संभाला।

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

इंटरप्ट को संभालना एक संवेदनशील कार्य है:

  • किसी भी समय व्यवधान उत्पन्न हो सकता है, कर्नेल इसे जल्द से जल्द बाहर निकालने की कोशिश करता है
  • एक रुकावट दूसरे रुकावट से बाधित हो सकती है
  • कर्नेल में ऐसे क्षेत्र होते हैं जिन्हें बिल्कुल भी बाधित नहीं किया जाना चाहिए

दो अलग-अलग व्यवधान स्तरों को परिभाषित किया गया है:

  • I / O उपकरणों द्वारा जारी किए गए नकाबपोश व्यवधान ; दो राज्यों में हो सकता है, नकाबपोश या बेपर्दा हो सकते हैं। केवल निरंकुश व्यवधानों को संसाधित किया जा रहा है।
  • असाध्य व्यवधान ; महत्वपूर्ण खराबी (फे हार्डवेयर विफलता); हमेशा CPU द्वारा संसाधित किया जाता है।

हर हार्डवेयर डिवाइस में खुद की इंटरप्ट रिक्वेस्ट (IRQ) लाइन होती है। IRQ को 0. से शुरू किया जाता है। सभी IRQ लाइनें प्रोग्रामेबल इंटरप्ट कंट्रोलर (PIC) से जुड़ी होती हैं। PIC IRQ पर सुनता है और उन्हें CPU को असाइन करता है। एक विशिष्ट IRQ लाइन को अक्षम करना भी संभव है।
आधुनिक मल्टीप्रोसेसिंग लिनक्स सिस्टम में आम तौर पर नए उन्नत PIC (APIC) शामिल होते हैं, जो CPU के बीच IRQ अनुरोधों को समान रूप से वितरित करता है।

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

आईडीटी के माध्यम से, कर्नेल को पता है कि कैसे हुई रुकावट या अपवाद को संभालना है।


तो, एक बाधा होने पर कर्नेल क्या करता है?

  • अगर (IR) PIC से IRQ है तो प्रत्येक निर्देश के बाद CPU जाँच करता है
  • यदि ऐसा है, तो IDT को किसी फ़ंक्शन में प्राप्त वेक्टर को मैप करने के लिए सुरक्षित करता है
  • अगर एक अधिकृत स्रोत द्वारा जारी किया गया था, तो चेक
  • बाधित प्रक्रिया के रजिस्टरों को बचाता है
  • व्यवधान को संभालने के लिए तदनुसार फ़ंक्शन को कॉल करें
  • बाधित प्रक्रिया के हाल ही में सहेजे गए रजिस्टर लोड करें और इसे फिर से शुरू करने का प्रयास करें

क्या आप स्पष्ट कर सकते हैं "सीपीयू प्रत्येक निर्देश के बाद जांचता है कि क्या (ए) पीआईसी से आईआरक्यू है" वास्तव में यह कैसे होता है? क्या यह VIPझंडे से संबंधित है या रजिस्टर में -flag जो भी हो? अग्रिम धन्यवाद
red0ct

7

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

जब प्रोसेसर एक बाधा अनुरोध प्राप्त करता है तो क्या होता है? सबसे पहले, CPU स्वचालित रूप से इंटरप्ट फ्लैग को रीसेट करके बाधित करता है। एक बार इंटरप्ट हैंडलिंग समाप्त हो जाने के बाद उन्हें पुनः चालू किया जाएगा। एक ही समय में सीपीयू उपयोगकर्ता मोड से कर्नेल मोड में इस तरह से सीपीयू को स्विच करने के लिए आवश्यक न्यूनतम काम करता है, जिससे यह बाधित कोड के निष्पादन को फिर से शुरू करने की अनुमति देगा। लिनक्स कर्नेल द्वारा भरे गए विशेष सीपीयू नियंत्रण संरचनाओं के साथ सीपीयू को पता चलता है कि कोड का पता लगाने के लिए किस नियंत्रण को पारित किया जाएगा। यह पता इंटरप्ट हैंडलर के पहले निर्देश का पता है, जो लिनक्स कर्नेल का एक हिस्सा है।

इंटरप्ट हैंडलिंग कर्नेल के पहले चरण के रूप में सिस्टम में किस तरह की घटना हुई है, यह पहचानने के लिए प्राप्त रुकावट के वेक्टर की पहचान करता है। इंटरप्ट वेक्टर यह परिभाषित करता है कि इसे संभालने के लिए लिनक्स क्या कार्रवाई करेगा। दूसरे चरण के रूप में लिनक्स शेष सीपीयू रजिस्टर (जो कि सीपीयू द्वारा स्वचालित रूप से सहेजा नहीं गया था) को बचाता है और जिसे संभावित रूप से बाधित प्रोग्राम द्वारा उपयोग किया जा सकता है। यह बहुत महत्वपूर्ण क्रिया है, क्योंकि यह लिनक्स को बाधित कार्यक्रम के बारे में पारदर्शी रूप से हस्तक्षेप करने की अनुमति देता है। एक तीसरे चरण के रूप में, लिनक्स कर्नेल वातावरण को सेट करके और इसके लिए आवश्यक सीपीयू स्थिति सेट करके लिनक्स कर्नेल मोड में स्विच करता है। और अंत में, वेक्टर डिपेंडेंट इंटरप्ट हैंडलर कहलाता है। (आप आर्क \ x86 \ कर्नेल \ प्रविष्टि_32 में BUILD_INTERRUPT3 मैक्रो पर देख सकते हैं। एस x86 वास्तुकला से संबंधित उदाहरण के लिए अतिरिक्त विवरण हड़पने के लिए) परिधीय उपकरणों के मामले में यह एक do_IRQ () दिनचर्या है। (आर्क में देखें \ x86 \ कर्नेल \ irq.c)

वेक्टर डिपेंडेंट इंटरप्ट हैंडलर आमतौर पर irq_enter () और irq_exit () कॉल के द्वारा लिपटा रहता है। इन कार्यों की एक जोड़ी के भीतर संलग्न कोड क्षेत्र, इस तरह के किसी भी अन्य क्षेत्रों के संबंध में परमाणु है और यह भी cli / sti के जोड़े के संबंध में परमाणु है। Irq_enter () और irq_exit () भी इंटरप्ट हैंडलिंग से संबंधित कुछ आंकड़ों को कैप्चर करता है। अंत में, कर्नेल वेक्टर प्राप्त करने के लिए वेक्टर में देखता है, जिसे प्राप्त किए गए इंटरक नंबर और कॉल हैंडल_irq () (आर्क \ x86 \ कर्नेल \ irq_32.c) से वेक्टर को सौंपा गया है।

इस बिंदु पर लिनक्स में इंटरप्ट हैंडलिंग का सामान्य हिस्सा समाप्त हो जाता है, क्योंकि कर्नेल डिवाइस ड्राइवर द्वारा स्थापित डिवाइस डिपेंडेंट हैंडलर रूटीन को irq डिस्क्रिप्टर के हिस्से के रूप में देखता है और इसे इनवाइट करता है। यदि ड्राइवर द्वारा ऐसा हैंडलर स्थापित नहीं किया गया था, तो कर्नेल सिर्फ इंटरप्ट कंट्रोलर पर व्यवधान को स्वीकार करता है और सामान्य अवरोध हैंडलर से बाहर निकल जाता है।

इंटरप्ट हैंडलिंग कर्नेल की समाप्ति के बाद प्रोग्राम की स्थिति को पुनर्स्थापित करता है जो पहले बाधित था और इस प्रोग्राम के निष्पादन को फिर से शुरू करता है।


CPU consults with special CPU control structures filled by Linux kernel to find an address of code to which control will be passed.हाँ! मुझे आश्चर्य है कि उन विशेष नियंत्रण संरचनाएं क्या हैं ...
automaton

3

सिद्धांत पहलू से, लगभग सब कुछ समझाया गया है। लेकिन अगर आप कर्नेल इंटरप्ट हैंडलिंग कोड फ्रेमवर्क पर स्पष्टीकरण की तलाश में हैं, तो निम्न लिंक आपको चाहिए: कर्नेल इंटरप्ट हैंडलिंग के अंदर एक कोड चलना

और अगर आप अभी भी इंटरप्टर्स और इंटरप्ट हैंडलर के बारे में सिद्धांत देख रहे हैं, तो मैं इसे पढ़ने की सलाह देता हूं: इंटरप्टर्स और इंटरप्टर्स को समझना

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.