2011-02-09 28 views
9

उसी कार्यक्रम में दो अलग-अलग ढेर का उपयोग करने की क्या आवश्यकता है? जाल कैसे उपयोगकर्ता स्टैक से कर्नेल स्टैक तक प्रोग्राम के मौजूदा ढेर को बदलता है? सिस्टम कॉल को पूरा करने के बाद यह उपयोगकर्ता स्टैक पर वापस कैसे आ जाता है?कर्नेल स्टैक और उपयोगकर्ता स्टैक के बीच क्या अंतर है?

क्या प्रत्येक प्रक्रिया में कर्नेल और उपयोगकर्ता स्टैक होता है?

+2

आप किस वास्तुकला का अध्ययन कर रहे हैं? – Gabe

+0

http://www.cs.umb.edu/~eoneil/cs444_f06/class10.html: इस मुद्दे को स्पष्ट करने के लिए कुछ अच्छा है। एक विश्वविद्यालय की वेबसाइट से !! –

+0

मैं 5 साल पहले विश्वविद्यालय से बाहर निकला था और यह सवाल अभी भी मुझे अपने स्नातक वर्षों की याद दिलाता है। हर बार जब मैं इस सवाल के लिए स्टैक ओवरफ्लो पर अधिसूचना प्राप्त करता हूं, तो मैं नॉस्टल्जिया से भरा हूं। – user609306

उत्तर

3

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

4

क्या एक ही कार्यक्रम में दो अलग अलग ढेर का उपयोग कर की जरूरत

मैं कभी नहीं, एक भी प्रक्रिया के मामले में दोनों एक कर्नेल और उपयोगकर्ता ढेर के बारे में सुना है, हालांकि यह बहुत आम हो सकता है। इस पर चर्चा here है।

कर्नेल स्टैक उपयोगकर्ता मोड स्टैक से अलग होना चाहिए। अन्यथा, उपयोगकर्ता मोड कोड कर्नेल स्टैक को दूषित कर सकता है, जिससे कर्नेल क्रैश हो जाता है।

कैसे जाल करता है उपयोगकर्ता ढेर से कार्यक्रम की वर्तमान ढेर में परिवर्तन ढेर कर्नेल

आप Intel Software Developer's Manuals की तरह कुछ देखने के लिए चाहते हो सकता है।

प्रत्येक प्रक्रिया गिरी और उपयोगकर्ता ढेर

मैं इस ऑपरेटिंग सिस्टम डिजाइन के साथ बदलता रहता है मान, हालांकि शायद यह काफी सार्वभौमिक है है है। ऊपर दिए गए लिंक इंगित करते हैं कि लिनक्स प्रति प्रक्रिया दो (या अधिक) ढेर का उपयोग करता है। मैंने प्रति-प्रक्रिया कर्नेल-मोड स्टैक का उपयोग करके विंडोज के बारे में नहीं सुना है।

+0

इसका मतलब है कि विंडोज़ में एक कर्नेल स्टैक प्रति सीपीयू है और लिनक्स में प्रति प्रक्रिया उपयोगकर्ता और कर्नेल स्टैक दोनों हैं। – user609306

10

प्रति CPU "कर्नेल स्टैक" है। प्रत्येक प्रक्रिया के लिए एक "उपयोगकर्ता स्टैक" होता है, हालांकि प्रत्येक थ्रेड का अपना स्टैक होता है, जिसमें उपयोगकर्ता और कर्नेल दोनों थ्रेड शामिल होते हैं।

कैसे "फलक बदलना" वास्तव में काफी सरल है।

सीपीयू एक बाधा के परिणामस्वरूप प्रक्रियाओं या "मोड" को बदलता है। बाधा कई अलग-अलग कारणों से हो सकती है - एक गलती होती है, (एक त्रुटि, या पेज-गलती की तरह), या एक भौतिक हार्डवेयर इंटरप्ट (एक डिवाइस से) - या एक टाइमर इंटरप्ट (उदाहरण के लिए होता है जब एक प्रक्रिया का उपयोग किया जाता है यह सभी CPU समय आवंटित है ")

किसी भी तरह से -। सभी रजिस्टरों - - जब इस बाधा कहा जाता है, CPU रजिस्टरों स्टैक पर सहेजे जाते हैं। ढेर सूचक ही सहित

आमतौर पर फिर एक" अनुसूचक "शेड्यूलर फिर चलाने के लिए एक और प्रक्रिया चुनता है - अपने सभी सहेजे गए रजिस्टरों को स्टैक पॉइंटर समेत पुनर्स्थापित करना, और जहां से यह छोड़ा गया है (रिटर्न-पता सूचक में संग्रहीत) से निष्पादन जारी रहता है।

इसे "संदर्भ स्विच" कहा जाता है।

मैं कुछ चीजों को सरल बना रहा हूं - जैसे मेमोरी प्रबंधन संदर्भ कैसे सहेजा और बहाल किया जाता है, लेकिन यह विचार है।यह केवल "स्टैक पॉइंटर" रजिस्टर सहित एक बाधा के जवाब में रजिस्टरों को सहेज रहा है और पुनर्स्थापित कर रहा है।

+0

इसका मतलब है कि विंडोज़ में एक कर्नेल स्टैक प्रति सीपीयू है और लिनक्स में प्रति प्रक्रिया उपयोगकर्ता और कर्नेल स्टैक दोनों हैं। – user609306

+3

विंडोज़ में प्रत्येक थ्रेड (यहां तक ​​कि उपयोगकर्ता-मोड धागे) का अपना कर्नेल स्टैक होता है। कर्नेल स्टैक्स निश्चित रूप से प्रति-CPU नहीं हैं। – Gabe

0

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

रेनी

7

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

3

मैं विश्वविद्यालय में ओएस सीख रहा हूं, और हमारी परियोजना हार्वर्ड द्वारा निर्मित OS/161 पर आधारित है। तो मेरा जवाब इस ओएस पर आधारित है।

ओएस/161 में, प्रत्येक थ्रेड में 2 स्टैक्स - उपयोगकर्ता/एप्लिकेशन प्रोग्राम के लिए एक, कर्नेल प्रोग्राम के लिए एक है।

1. उसी कार्यक्रम में दो अलग-अलग ढेर का उपयोग करने की क्या आवश्यकता है?

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

2. उपयोगकर्ता स्टैक से कर्नेल स्टैक तक प्रोग्राम के वर्तमान ढेर को कैसे बदलता है?

ओएस/161 में, जाल को एप्लिकेशन प्रोग्राम से कर्नेल में स्थानांतरित करने के लिए उपयोग किया जाता है। तीन तंत्र हैं जो जाल का आह्वान कर सकते हैं: सिस्टम कॉल, अपवाद और इंटरप्ट्स। कर्नेल स्टैक में जाल फ्रेम का उपयोग मौजूदा थ्रेड संदर्भ को सहेजने के लिए किया जाता है।

बाद विस्तृत प्रक्रिया (lecture note of UWaterloo CS350 से) है:

  • जब ऊपर तंत्र में से एक होती है, हार्डवेयर सीपीयू विशेषाधिकार प्राप्त मोड में स्विच और स्थानान्तरण, एक पूर्वनिर्धारित स्थान को नियंत्रित जो एक कर्नेल पर हैंडलर स्थित होना चाहिए।

  • गिरी हैंडलर एक जाल फ्रेम बनाता है और इतना है कि हैंडलर कोड CPU पर क्रियान्वित किया जा सकता यह आवेदन धागा संदर्भ बचाता करने के लिए उपयोग करता है।

  • से ठीक पहले गिरी हैंडलर निष्पादित नहीं हो, यह जाल फ्रेम से आवेदन धागा संदर्भ पुनर्स्थापित करता है, आवेदन करने के लिए नियंत्रण लौटने से पहले।

3. सिस्टम कॉल को पूरा करने के बाद यह उपयोगकर्ता स्टैक पर कैसे वापस आ जाता है?

ऊपर दी गई प्रक्रिया इस प्रश्न पर भी स्पष्ट रूप से बताती है।

+0

धन्यवाद, यह 4 साल हो गया है कि मैंने इस सवाल से पूछा, मैं उस समय विश्वविद्यालय में था। फिर भी आपके उत्तर ने मेरा ज्ञान बढ़ाया। – user609306

0

प्रक्रिया का संदर्भ (पीएसडब्ल्यू, रजिस्टरों की स्थिति, पीसी ...) प्रक्रिया के पीसीबी में, स्मृति के कर्नेल स्पेस में, स्टैक में नहीं बचाया जाता है। हां, प्रत्येक उपयोगकर्ता प्रक्रिया के लिए एक ढेर है और अधिक, उपयोगकर्ता स्पेस मेमोरी में प्रत्येक थ्रेड के लिए एक स्टैक। कर्नेल में, डेटा संरचनाओं को कर्नेल में फ़ंक्शन के गुणांक कोड द्वारा साझा किया जाता है। स्टैक का उपयोग प्रक्रिया के कॉल और स्थानीय चर के लिए किया जाता है, संदर्भ को सहेजने के लिए नहीं।

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