अब तक जो मैंने पढ़ा है, उसके अनुसार, "जब कर्नेल को एक बाधा मिलती है, तो सभी पंजीकृत हैंडलर को आमंत्रित किया जाता है।"
मैं समझता हूं कि प्रत्येक IRQ के लिए पंजीकृत हैंडलर के माध्यम से देखा जा सकता है /proc/interrupts
, और मैं यह भी समझता हूं कि पंजीकृत हैंडलर उन ड्राइवरों से आते हैं जिन्होंने request_irq
कॉलबैक फॉर्म में मोटे तौर पर पास होने का आह्वान किया है:
irqreturn_t (*handler)(int, void *)
मुझे जो पता है, उसके आधार पर, विशेष आईआरक्यू से जुड़े इन रुकावट हैंडलर कॉलबैक में से प्रत्येक को आमंत्रित किया जाना चाहिए, और यह निर्धारित करने के लिए हैंडलर पर निर्भर है कि क्या वास्तव में इसके द्वारा नियंत्रित किया जाना चाहिए। यदि हैंडलर को विशेष व्यवधान को संभालना नहीं चाहिए, तो उसे कर्नेल मैक्रो वापस करना होगा IRQ_NONE
।
मुझे यह समझने में परेशानी हो रही है कि प्रत्येक चालक से यह निर्धारित करने की अपेक्षा की जाती है कि उसे व्यवधान को संभालना चाहिए या नहीं। मुझे लगता है कि वे आंतरिक रूप से ट्रैक रख सकते हैं यदि वे एक बाधा की उम्मीद कर रहे हैं। यदि हां, तो मुझे नहीं पता कि वे उस स्थिति से कैसे निपट सकते हैं जिसमें एक ही IRQ के पीछे कई ड्राइवर एक बाधा की उम्मीद कर रहे हैं।
कारण मैं इन विवरणों को समझने की कोशिश कर रहा हूं, क्योंकि मैं kexec
सिस्टम ऑपरेशन के बीच में कर्नेल को फिर से निष्पादित करने के लिए तंत्र के साथ खिलवाड़ कर रहा हूं, जबकि PCIe पुल पर और साथ ही डाउनस्ट्रीम PCI पर विभिन्न रजिस्टरों के साथ खेलना डिवाइस। और ऐसा करने में, एक रिबूट के बाद मैं या तो कर्नेल पैनिक्स प्राप्त कर रहा हूं, या अन्य ड्राइवर शिकायत कर रहे हैं कि वे बाधित हो रहे हैं भले ही कोई ऑपरेशन नहीं हो रहा था।
हैंडलर ने कैसे तय किया कि बाधा को इसके द्वारा नियंत्रित किया जाना चाहिए।
संपादित करें: यदि यह प्रासंगिक है, तो प्रश्न में सीपीयू वास्तुकला है x86
।