2009-05-20 17 views
21

क्या सभी प्रक्रियाओं के लिए कर्नेल स्टैक साझा किया गया है या प्रत्येक प्रक्रिया के लिए एक अलग कर्नेल स्टैक है? यदि यह प्रत्येक प्रक्रिया के लिए पृथक है जहां यह स्टैक पॉइंटर संग्रहीत है? Task_struct में?लिनक्स प्रक्रिया के लिए कर्नेल स्टैक

उत्तर

17

केवल एक सामान्य कर्नेल मेमोरी है। इसमें प्रत्येक प्रक्रिया में इसका अपना कार्य_स्ट्रक्चर + कर्नेल स्टैक होता है (डिफ़ॉल्ट 8K द्वारा)।

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

+1

यह स्टैक पॉइंटर कहाँ संग्रहीत किया जाता है? – suresh

+2

एक संदर्भ में पुराने स्टैक पॉइंटर मान को प्रक्रिया के कार्य_स्ट्रक्चर में संग्रहीत किया जाता है जिसे एक नई प्रक्रिया के साथ प्रतिस्थापित किया जा रहा है और नई प्रक्रिया के लिए स्टैक पॉइंटर को इस नई प्रक्रिया के task_struct से पढ़ा जाता है। –

12

This old article कहता है कि प्रत्येक प्रक्रिया का अपना कर्नेल स्टैक होता है। टिप्पणियां देखें कि यह एक बहुत अच्छा डिजाइन क्यों प्रतीत होता है।

मैंने सुनिश्चित करने के लिए reading the current source की कोशिश की, लेकिन चूंकि कर्नेल स्टैक "अंतर्निहित" है, यह task_struct में दिखाई नहीं दे रहा है। लेख में इसका उल्लेख है।

यह उत्तर टिप्पणियों से ज्ञान को शामिल करने के लिए संपादित किया गया था। धन्यवाद।

+3

मुझे गंभीरता से संदेह है कि इसे बदला जा सकता है। कर्नेल स्टैक एक गैर-साझा स्थान है जहां सिस्टम कॉल अपना डेटा डाल सकते हैं। यदि आप उन्हें प्रक्रियाओं के बीच साझा करेंगे, तो कई कर्नेल दिनचर्या एक ही समय में एक ही स्टैक का उपयोग कर सकते हैं -> डेटा भ्रष्टाचार। –

+1

मुझे लगता है कि प्रत्येक प्रक्रिया को अपने कर्नेल स्टैक की आवश्यकता होती है, क्योंकि कई अलग-अलग प्रक्रिया एक साथ सिस्टम कॉल निष्पादित कर सकती हैं और आप उन्हें मिश्रित नहीं करना चाहेंगे। –

+0

प्रत्येक प्रक्रिया में अपना कर्नेल स्टैक होता है और प्रत्येक कर्नेल स्टैक की इसकी संबंधित प्रक्रिया होती है। यह कभी नहीं बदला गया है। यही कारण है कि "ps" में कुछ छद्म प्रक्रिया है। –

2

रॉबर्ट लव के "लिनक्स कर्नेल डेवलपमेंट" पुस्तक में प्रक्रिया कर्नेल स्टैक के बारे में एक अच्छी व्याख्या है।

और हाँ, प्रत्येक प्रक्रिया का अपना कर्नेल स्टैक होता है और यदि मैं गलत नहीं हूं तो इसका सूचक थ्रेड_इनोफ़ो संरचना पर संग्रहीत होता है। लेकिन मैं इसके बारे में वास्तव में निश्चित नहीं हूं, और सीपीयू आर्किटेक्चर के आधार पर, संरचना task_struct प्रक्रिया कर्नेल स्टैक की शुरुआत या अंत में संग्रहीत है।

चीयर्स। कार्लोस माईओलिनो

+2

लिनक्स 2.6 कर्नेल के बाद से, 'thread_info' संरचना प्रत्येक प्रक्रिया के कर्नेल स्टैक के अंत में संग्रहीत होती है, न कि task_struct संरचना। 'Thread_info' स्ट्रक्चर में 'task_struct' संरचना में सूचक शामिल है –

1

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

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