वास्तव में IRQL_NOT_LESS_OR_EQUAL क्या है?


15

वास्तव में IRQL_NOT_LESS_OR_EQUAL क्या है? IRQL क्या है? IRQL किन चीजों का उपयोग करता है? इसे कम या बराबर करने की आवश्यकता क्यों है? क्या यह कम या बराबर नहीं होने का कारण होगा? OS इससे कम या बराबर नहीं होने के कारण पुनर्प्राप्त क्यों नहीं कर सकता? क्या IRQL केवल विंडोज को प्रभावित करता है?

यह त्रुटि बहुत सामान्य प्रतीत होती है । मैं मदद नहीं माँग रहा हूँ, मैं स्पष्टीकरण माँग रहा हूँ।




IRQL_NOT_LESS_OR_EQUAL बग चेक का मान 0x0000000A है। यह इंगित करता है कि Microsoft Windows या कर्नेल-मोड ड्राइवर ने एक अमान्य पते पर पृष्ठांकित मेमोरी को एक्सेस किया है, जबकि एक उठाए हुए व्यवधान अनुरोध स्तर (IRQL) पर। IQL कर्नेल की एक प्राथमिकता प्रणाली है। कर्नेल में कुछ IRQL से आप डेटा का उपयोग नहीं कर सकते हैं जो पेजफाइल में संग्रहीत हैं। डीएमपी का विश्लेषण करें और देखें कि क्या 3 पार्टी कोड शामिल है। यदि नहीं, तो मुद्दों के लिए अपनी स्मृति का परीक्षण करें।
जादूड्रे

1
मजेदार बात यह है कि संदेशों के लिए सबसे अधिक व्यावहारिक प्रतिक्रिया, क्या यह मायने नहीं रखता है कि इसका मतलब यह है कि सभी उस मामले का क्या करें जब आप उस संदेश को प्राप्त करते हैं, या, यह सब एक प्रासंगिक अनुवाद है, जो मामले में है कि IRQL BSOD, आमतौर पर "ड्राइवर समस्या" है! इसलिए यह जानने की कोशिश करें कि ड्राइवर क्या है और ड्राइवरों को हटाएं और पुनः स्थापित करें, इस तरह की बात .. लेकिन यह एक अच्छा सवाल है कि यह वैसे भी क्या बात कर रहा है ... मुझे पता है कि एक आईआरक्यू क्या है, लेकिन मुझे नहीं पता था कि आईआरक्यूएल क्या था जेमी का जवाब!
बार्लोप

जवाबों:


26

यह जटिल है। ;)

नहीं, वास्तव में, यह है।

IRQL का मतलब है "इंटरप्ट रिक्वेस्ट लेवल"। यह एक संख्या है, जिसमें विंडोज x86 सिस्टम पर 0 से 31 तक और x64 सिस्टम पर 15 के माध्यम से 0 है। यह अन्य कर्नेल मोड कार्यों के सापेक्ष कर्नेल मोड कार्य के "महत्व" का प्रतिनिधित्व करता है।

IRQL प्रोसेसर का एक विंडोज-डिफाइन स्टेट है - प्रोसेस या थ्रेड का नहीं - जो विंडोज को इंगित करता है कि जो भी प्रोसेसर कर रहा है वह अन्य कार्यों से बाधित हो सकता है या नहीं। यदि एक नया कार्य (जैसे कि एक बाधा सेवा दिनचर्या) में प्रोसेसर के वर्तमान आईआरक्यूएल की तुलना में अधिक आईआरक्यूएल है, तो हाँ, यह वर्तमान कार्य को बाधित कर सकता है; अन्यथा नहीं। मल्टीप्रोसेसर सिस्टम पर प्रत्येक प्रोसेसर का अपना IRQL होता है। इसमें हाइपरथ्रेडिंग द्वारा बनाए गए "लॉजिकल प्रोसेसर" शामिल हैं।

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

(मुझे यह भी उल्लेख करना चाहिए कि यहां "कर्नेल कार्य" शब्द आधिकारिक नहीं है। विंडोज वास्तव में इन चीजों को "कर्नेल कार्य" नहीं कहता है, वे प्रबंधित ऑब्जेक्ट नहीं हैं जैसे कि प्रक्रियाएं और धागे हैं, और x86 से कोई संबंध नहीं है "कार्य गेट्स "और" टास्क मैनेजर "में दिखाई गई किसी भी चीज़ के लिए नहीं। जैसा कि मैंने (और अन्य लोगों) ने यहां शब्द का उपयोग किया है," कर्नेल मोड टास्क "वास्तव में एक परिभाषित शुरुआत और अंत के साथ कुछ भी कवर करता है" जिसे आईआरक्यूएल 2 में कर्नेल मोड में करने की आवश्यकता है या ऊपर। "एक बाधा सेवा दिनचर्या एक" कर्नेल मोड कार्य "का एक उदाहरण है; इसलिए एक डीपीसी दिनचर्या है। लेकिन एक अन्य उदाहरण कर्नेल मोड थ्रेड में कोड हो सकता है। ऐसे धागे IRQL 0 से शुरू होते हैं, लेकिन यदि कोड का हिस्सा है। उठाताIRQL 2 या उससे ऊपर, कुछ करता है, और फिर अपने पिछले IRQL पर लौटता है, कोड का उच्च-IRQL हिस्सा एक उदाहरण है जिसे मैं यहां "कर्नेल कार्य" कह रहा हूं। )

प्रदर्शन मॉनिटर IRQL 2 पर "% DPC समय" और IRQL> 2 में "% बीच का समय" के रूप में बिताए गए समय को दर्शाता है, भले ही वह समय वास्तव में DPC दिनचर्या या ISR में व्यतीत हुआ हो या IRQL को बढ़ाने का एक परिणाम था एक कम मूल्य। प्रत्येक एक उपसमुच्चय है जो PerfMon "% विशेषाधिकारित समय" के रूप में दिखाता है - जिसे "कर्नेल मोड समय" लेबल किया जाना चाहिए था।

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

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

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

उच्च-IRQL कार्य ज्यादातर डिवाइस ड्राइवरों के बीच की बाधा सेवा दिनचर्या होते हैं, क्योंकि सभी डिवाइसों का व्यवधान IRQL> 2 में होता है। इसमें मदरबोर्ड पर टाइमर चिप से अवरोध शामिल होता है जो ओएस में टाइमकीपिंग और समय संचालित-गतिविधि को संचालित करता है। इसका IRQL सभी "साधारण" हार्डवेयर उपकरणों से ऊपर है।

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

उपयोगकर्ता मोड कोड हमेशा IRQL 0. पर होता है। कर्नेल मोड कोड 0 से किसी भी IRQL पर चल सकता है जो भी अधिकतम है। IRQL 1 एक विशेष मामला है; यह केवल कर्नेल मोड है, लेकिन शेड्यूलिंग पर इसका कोई प्रभाव नहीं है, और वास्तव में प्रोसेसर की तुलना में एक थ्रेड की स्थिति अधिक है - यह उदाहरण के लिए, थ्रेड संदर्भ स्विच के दौरान सहेजा और पुनर्स्थापित किया गया है।

विभिन्न सीरियलाइज़ेशन गारंटी को बनाए रखने के लिए, अधिकांश अपवादों (शून्य से विभाजित की जाने वाली चीजें, या पृष्ठ दोष जैसे मेमोरी एक्सेस उल्लंघन) केवल IRQL 2 या उससे ऊपर के हैंडल-सक्षम नहीं हैं। (IRQL 2 btw को आमतौर पर "प्रेषण स्तर" या "DPC स्तर" कहा जाता है।

और अब हम अंत में इस बगचेक कोड की व्याख्या कर सकते हैं!

IRQL_NOT_LESS_OR_EQUAL का सबसे आम मामला पृष्ठ दोष ("निवासी नहीं" वर्चुअल पता एक्सेस करने का प्रयास) या मेमोरी एक्सेस उल्लंघन (रीड-ओनली पेज पर लिखने का प्रयास, या परिभाषित नहीं होने वाले पेज तक पहुंचने के कारण) के कारण होता है सभी पर), जो आईआरक्यूएल 2 या इसके बाद के संस्करण पर होता है।

यदि ऐसे अपवादों को IRQL 0 या 1 पर उठाया जाता है, तो उन्हें सिस्टम द्वारा आपूर्ति किए गए कोड (जैसे पृष्ठ दोष हैंडलर) या डेवलपर द्वारा प्रदान किए गए अपवाद हैंडलर द्वारा "हैंडल" किया जा सकता है। हालांकि, अधिकांश अपवादों को आईआरक्यूएल 2 या उससे ऊपर होने पर बिल्कुल भी नियंत्रित नहीं किया जा सकता है।

तो ... बगचेक कोड का अर्थ है "एक प्रकार का अपवाद जिसे केवल IRQL 0 या 1 पर ही हैंडल किया जा सकता है, जब IRQL 2 या अधिक था।" यानी "1 से कम या इसके बराबर नहीं"। अजीब शब्द है, लेकिन वहाँ यह है।

कुछ अन्य चीजें हैं जो इस बगचेक को ट्रिगर कर सकती हैं, और यह मान कि IRQL कम या बराबर नहीं है हमेशा 1 नहीं होता है, लेकिन वे केवल शायद ही कभी होते हैं। WinDBG प्रलेखन उन्हें सूचीबद्ध करता है।


बहुत बढ़िया जवाब। क्या आप किसी भी जानी-पहचानी चीज़ के बारे में जानते हैं जो IRQL 2 से अधिक है?
स्कॉट चेम्बरलेन

1
शायद डिवाइस ड्राइवर।
लॉरेंस

1
@LawrenceC हाँ। सभी हार्डवेयर बीच में आता है IRQL पर हैं> 2.
जेमी Hanrahan
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.