जवाबों:
- कर्नेल स्टैक और उपयोगकर्ता स्टैक के बीच अंतर क्या है?
संक्षेप में, कुछ भी नहीं - मेमोरी में एक अलग स्थान (और इसलिए स्टैकपॉइंट रजिस्टर के लिए एक अलग मूल्य) का उपयोग करने के अलावा, और आमतौर पर अलग-अलग मेमोरी एक्सेस सुरक्षा। उपयोगकर्ता मोड में निष्पादित करते समय, कर्नेल मेमोरी (जिसका हिस्सा कर्नेल स्टैक है) मैप किए जाने पर भी पहुंच योग्य नहीं होगा। इसके विपरीत, स्पष्ट रूप से कर्नेल कोड (लिनक्स में, फ़ंक्शन जैसे copy_from_user()
) के माध्यम से अनुरोध किए बिना , उपयोगकर्ता मेमोरी (उपयोगकर्ता स्टैक सहित) आमतौर पर सीधे पहुंच योग्य नहीं होती है।
- [एक अलग] कर्नेल स्टैक का उपयोग क्यों किया जाता है?
विशेषाधिकारों और सुरक्षा का पृथक्करण। एक के लिए, यूजरस्पेस प्रोग्राम अपने स्टैक (पॉइंटर) को कुछ भी बना सकते हैं जो वे चाहते हैं, और आमतौर पर एक वैध होने के लिए कोई वास्तुशिल्प आवश्यकता नहीं होती है। इसलिए कर्नेल उपयोगकर्ता के स्टैकपॉइंट को वैध और प्रयोग करने योग्य होने पर भरोसा नहीं कर सकता है, और इसलिए उसे अपने नियंत्रण में एक सेट की आवश्यकता होगी। विभिन्न सीपीयू आर्किटेक्चर इसे अलग-अलग तरीकों से लागू करते हैं; विशेषाधिकार मोड स्विच होने पर x86 CPU स्वचालित रूप से स्टैकपॉइंट को स्विच करते हैं, और विभिन्न विशेषाधिकार स्तरों के लिए उपयोग किए जाने वाले मान कॉन्फ़िगर करने योग्य होते हैं - विशेषाधिकार कोड (यानी केवल कर्नेल) द्वारा।
- यदि एक ISR में एक स्थानीय चर घोषित किया जाता है, तो इसे कहाँ संग्रहीत किया जाएगा?
कर्नेल स्टैक पर। कर्नेल (लिनक्स कर्नेल, वह) ISRs को x86 आर्किटेक्चर के इंटरप्ट गेट्स से सीधे हुक नहीं करता है, बल्कि इंटरप्ट डिस्पैच को एक सामान्य कर्नेल इंटरप्ट एंट्री / एग्जिट मैकेनिज्म के लिए भेजता है, जो रजिस्टर्ड बॉलर (ओं) को कॉल करने से पहले प्री-इंटरप्ट रजिस्टर स्टेट बचाता है। । सीपीयू ही जब एक बाधा भेज रहा है एक विशेषाधिकार और / या स्टैक स्विच निष्पादित कर सकता है, और यह कर्नेल द्वारा उपयोग / सेट किया जाता है ताकि आम रुकावट प्रवेश कोड पहले से मौजूद कर्नेल स्टैक पर भरोसा कर सके।
उस ने कहा, कर्नेल कोड निष्पादित करते समय होने वाली रुकावट बस (जारी) उस बिंदु पर जगह में कर्नेल स्टैक का उपयोग करेगी। यह हो सकता है, अगर इंटरप्ट हैंडलर में नेस्टेड कॉल पाथ हो, स्टैक ओवरफ्लो की ओर ले जाए (यदि एक गहरी कर्नेल कॉल पथ बाधित है और हैंडलर दूसरे गहरे पथ का कारण बनता है, लिनक्स में, फाइल सिस्टम / सॉफ्टवेयर RAID कोड iptables के लिए नेटवर्क कोड द्वारा सक्रिय किया जा रहा है) अछूते पुराने गुठली में इस तरह के ट्रिगर करने के लिए जाना जाता है ... समाधान ऐसे वर्कलोड के लिए कर्नेल स्टैक के आकार को बढ़ाने के लिए है)।
- क्या प्रत्येक प्रक्रिया का अपना कर्नेल स्टैक है?
न केवल प्रत्येक प्रक्रिया - प्रत्येक थ्रेड का अपना कर्नेल स्टैक होता है (और, वास्तव में, इसका अपना उपयोगकर्ता स्टैक भी होता है)। याद रखें कि प्रक्रियाओं और थ्रेड्स (लिनक्स के बीच) का एकमात्र अंतर यह है कि कई थ्रेड्स एक पता स्थान (एक प्रक्रिया का निर्माण) साझा कर सकते हैं।
- प्रक्रिया इन दोनों ढेर के बीच कैसे समन्वय करती है?
बिल्कुल नहीं - इसकी आवश्यकता नहीं है। निर्धारण (कैसे / कब अलग-अलग सूत्र चलाए जा रहे हैं, उनका राज्य कैसे बचाया और बहाल किया जाता है) ऑपरेटिंग सिस्टम का कार्य है और प्रक्रियाओं को इसके साथ खुद को चिंता करने की आवश्यकता नहीं है। धागे बनाए जाते हैं के रूप में (और प्रत्येक प्रक्रिया के कम से कम एक धागा होना आवश्यक है), गिरी, उनके लिए कर्नेल ढेर बनाता है, जबकि यूज़रस्पेस ढेर या तो स्पष्ट बनाई गई हैं / द्वारा जो भी तंत्र (कार्यों की तरह एक धागा बनाने के लिए प्रयोग किया जाता है प्रदान की makecontext()
या pthread_create()
करने के लिए फोन करने वाले की अनुमति देते हैं "चाइल्ड" थ्रेड स्टैक) के लिए उपयोग किए जाने वाले मेमोरी क्षेत्र को निर्दिष्ट करें, या विरासत में मिला (ऑन-एक्सेस मेमोरी क्लोनिंग, आमतौर पर "कॉपी ऑन राइट" / गाय कहा जाता है, जब एक नई प्रक्रिया बनाते हैं)।
ने कहा कि,(स्थिति, इसके बीच धागे का स्टैकपॉइंट है)। इस के लिए कई तरीके हैं: यूनिक्स संकेतों setcontext()
, pthread_yield()
/ pthread_cancel()
... - लेकिन इस मूल प्रश्न से थोड़ा disgressing है।
मेरा उत्तर मेरे सामान के साथ अन्य SO प्रश्नों से एकत्र किया गया है।
What's the difference between kernel stack and user stack?
कर्नेल प्रोग्रामर के रूप में, आप जानते हैं कि कर्नेल को गलत उपयोगकर्ता कार्यक्रमों से प्रतिबंधित किया जाना चाहिए। मान लें कि आप कर्नेल और उपयोगकर्ता स्थान दोनों के लिए एक ही स्टैक रखते हैं, तो उपयोगकर्ता एप्लिकेशन में सरल segfault कर्नेल को क्रैश करता है और पुनरारंभ की आवश्यकता होती है।
CPU के प्रति ISR स्टैक की तरह एक "कर्नेल स्टैक" और प्रत्येक प्रक्रिया में एक "कर्नेल स्टैक" है। प्रत्येक प्रक्रिया के लिए एक "उपयोगकर्ता स्टैक" है, हालांकि प्रत्येक थ्रेड का अपना स्टैक है, जिसमें उपयोगकर्ता और कर्नेल थ्रेड दोनों शामिल हैं।
http://linux.derkeiler.com/Mailing-Lists/Kernel/2004-10/3194.html
Why kernel stack is used?
इसलिए जब हम कर्नेल मोड में होते हैं, तो फ़ंक्शन कॉल, उपयोगकर्ता स्थान के समान स्थानीय चर से निपटने के लिए स्टैक तरह का तंत्र आवश्यक होता है।
http://www.kernel.org/doc/Documentation/x86/kernel-stacks
If a local variable is declared in an ISR, where it will be stored?
इसे ISR स्टैक (IRQSTACKSIZE) में संग्रहित किया जाएगा। ISR एक अलग इंटरप्ट स्टैक पर तभी चलता है जब हार्डवेयर इसका समर्थन करता है। अन्यथा, ISR स्टैक फ़्रेम को बाधित धागे के ढेर पर धकेल दिया जाता है।
उपयोगकर्ता स्थान को नहीं जानता है और स्पष्ट रूप से इस बात की परवाह नहीं करता है कि क्या वर्तमान प्रक्रिया के कर्नेल स्टैक या एक अलग ISR स्टैक में बाधित है। चूंकि प्रति सीपीयू में रुकावट आती है, इसलिए ISR स्टैक प्रति सीपीयू होना चाहिए।
Does each process has its own kernel stack ?
हाँ। प्रत्येक प्रक्रिया का अपना कर्नेल स्टैक होता है।
Then how the process coordinates between both these stacks?
@ फ्रैंक का जवाब मुझे बहुत अच्छा लगता है।
- कर्नेल स्टैक और उपयोगकर्ता स्टैक के बीच अंतर क्या है
रॉबर्ट लव के लिनक्स कर्नेल विकास से संदर्भ लेते हुए, मुख्य अंतर आकार है:
उपयोगकर्ता-अंतरिक्ष स्टैक पर कई वैरिएबल को आवंटित करने के साथ-साथ विशाल संरचनाओं और हजार-तत्व सरणियों से दूर हो सकते हैं।
यह व्यवहार कानूनी है क्योंकि उपयोगकर्ता-स्थान में एक बड़ा स्टैक है जो गतिशील रूप से विकसित हो सकता है।
कर्नेल स्टैक न तो बड़ा है और न ही गतिशील है; यह छोटा है और आकार में तय है।
कर्नेल के स्टैक का सही आकार वास्तुकला द्वारा भिन्न होता है।
X86 पर, स्टैक का आकार संकलन-समय पर विन्यास योग्य है और यह 4KB या 8KB हो सकता है।
ऐतिहासिक रूप से, कर्नेल स्टैक दो पृष्ठ हैं, जो आमतौर पर यह दर्शाता है कि यह 32-बिट आर्किटेक्चर पर 8KB और 64-बिट आर्किटेक्चर पर 16KB है - यह आकार निश्चित और निरपेक्ष है।
प्रत्येक प्रक्रिया अपने स्वयं के ढेर को प्राप्त करती है।
इसके अलावा कर्नेल स्टैक में थ्रेड_info के लिए एक पॉइंटर होता है जो थ्रेड के बारे में जानकारी रखता है।