जैसा कि मैट ने लिखा था, यह शायद अनुचित रूप से स्कॉप्ड है। हालांकि, मैं उम्मीदों के बारे में अधिक ध्यान देने की कोशिश करूंगा क्योंकि मैं एक उचित प्रश्न पूछना चाहता हूं, उम्मीद है कि इससे आपको शोध शुरू करने में मदद मिलेगी।
1 "प्रीम्प्शन" और "संदर्भ स्विच" के बीच क्या अंतर है?
मोचन इसकी भागीदारी के बिना प्रक्रिया में बाधा डालने का कार्य है। इस संदर्भ में, शायद इसका मतलब है कि एक टाइमर बाधा आग लग जाएगी।यह शब्द preemption: की कानूनी अवधारणा से आता है जो दूसरों के सामने या पहले दावा करने या खरीदने का कार्य या अधिकार है। आपके उद्देश्यों के लिए, इसका मतलब है कि जब टाइमर आग को बाधित करता है, तो इंटरप्ट सेवा दिनचर्या (आईएसआर) को उस कोड पर प्राथमिकता होती है जो पहले चल रहा था। इसमें कर्नेल को बिल्कुल शामिल करने की आवश्यकता नहीं है; आपके पास किसी भी आईएसआर में कोड चल रहा है जो प्रीपेप्टिव रूप से चलाएगा।
एक संदर्भ स्विच तब होता है जब ओएस कोड (प्रीपेप्टिव चल रहा है) एक प्रक्रिया या धागे के संदर्भ और दूसरे के बीच प्रोसेसर (रजिस्टर्स, मोड और स्टैक) की स्थिति को बदल देता है। प्रोसेसर की स्थिति एक थ्रेड में कोड की एक निश्चित पंक्ति पर हो सकती है। इसमें रजिस्टरों में अस्थायी डेटा होगा, स्मृति के एक निश्चित क्षेत्र में एक स्टैक सूचक, और अन्य राज्य की जानकारी होगी। एक प्रीपेप्टिव ओएस इस स्थिति को स्टोर कर सकता है (या तो स्थैतिक मेमोरी या प्रक्रियाओं के ढेर पर) और पिछली प्रक्रिया की स्थिति लोड कर सकता है। इसे एक संदर्भ स्विच के रूप में जाना जाता है।
2 प्रीपेप्टिव और अपरिवर्तनीय कर्नेल के बीच महत्वपूर्ण अंतर क्या हैं? कर्नेल प्रीपेप्टिव बनाने के लिए प्रोग्रामर से सभी कामों की क्या आवश्यकता है?
एक प्रीपेप्टिव कर्नेल में, किसी भी दो असेंबली निर्देशों (जिसे 'अनुक्रम बिंदु' के नाम से जाना जाता है) के बीच एक बाधा उत्पन्न हो सकती है। एक गैर-प्रीपेप्टिव कर्नेल में, चलने वाली प्रक्रिया को yield()
फ़ंक्शन को अन्य थ्रेड चलाने की अनुमति देने के लिए कॉल करना होगा। प्रीपेप्टिव कर्नल अधिक जटिल हैं, लेकिन समेकन का बेहतर भ्रम प्रदान करते हैं। गैर-प्रीपेप्टिव कर्नेल setjmp.h
के साथ बहुत आसानी से किए जा सकते हैं, लेकिन प्रत्येक थ्रेड को नियमित रूप से yield()
पर कॉल करना होगा या अन्य थ्रेड नहीं चलेंगे।
जब yield()
जैसे फ़ंक्शन को कॉल किया जाता है, प्रोसेसर की स्थिति स्वचालित रूप से संग्रहीत होती है। जब आप अपना ओएस प्रीपेप्टिव बनाना चाहते हैं, तो आपको यह जानकारी मैन्युअल रूप से स्टोर करनी होगी।
3 उपयोगकर्ता मोड के साथ कैसे बनाएं और काम करें?
एआरएम दस्तावेज़ कहते हैं कि उपयोगकर्ता मोड में, किसी विशेषाधिकार प्राप्त मोड में स्विच करने के लिए कोई भी निर्देश अपरिभाषित निर्देश के रूप में माना जाएगा।
सही। हालांकि, वे यह भी कहते हैं कि कोई भी बाधा स्वचालित रूप से विशेषाधिकार प्राप्त मोड में चली जाएगी। एआरएम सिस्टम पर, आप सॉफ़्टवेयर बाधा उत्पन्न करने के लिए svc
निर्देश का उपयोग कर सकते हैं। एसवीसी कोड (आपके ओएस का हिस्सा) फिर विशेषाधिकार प्राप्त मोड में चलाने में सक्षम होगा।
4 यदि ऐसा है, तो उपयोगकर्ता कोड प्रोग्राम के लिए कर्नेल कोड का उपयोग करने का एकमात्र तरीका सिस्को है?
सही। कम से कम, यह एकमात्र सुरक्षित या सही तरीका है।
5 कर्नेल उपयोगकर्ता के साथ प्रतिक्रिया या बातचीत कैसे करता है?
एआरएम पर, एसवीसी निर्देश 8-बिट मान प्राप्त कर सकता है। इसका उपयोग उपज जैसे 256 सिस्को, इंटरप्ट सक्षम करने, इंटरप्ट अक्षम करने, या जो भी आपको चाहिए, उत्पन्न करने के लिए किया जा सकता है। यदि आपको इसकी आवश्यकता हो तो आप एक साझा मेमोरी या संदेश पारित करने के लिए संदेश भी चुन सकते हैं।
6 क्या इसका मतलब यह है कि बूटिंग (सरल प्रणाली में) के बाद केवल कर्नेल थ्रेड निष्क्रिय धागा होगा?
यह पूरी तरह से निर्भर करता है कि आप अपने सिस्टम को कैसे डिजाइन करते हैं। यह शायद आसान है कि अगर आप अपने कर्नेल के बाद ही अपने सभी धागे सृजन किया गया है शुरू करने के लिए चुनते हैं - कि जिस तरह से आप के बारे में गतिशील रूप से आवंटित धागे में चिंता करने की जरूरत नहीं है। या, आप निष्क्रिय धागे से शुरू कर सकते हैं और बाद में अन्य थ्रेड जोड़ सकते हैं (रिमोट शैल के माध्यम से? मुझे लगता है कि आप कम से कम एक उपयोगकर्ता थ्रेड लगातार चलाना चाहते हैं ...)
7 यदि पृष्ठ कर्नेल कोड जब एक syscall पर एक उपयोगकर्ता प्रक्रिया का उपयोग करने जा, तो या बीच में और डेटा रहता है तुच्छ है, कैसे करता है कर्नेल कोड वर्चुअल ऐड्रेस स्पेस में मैप किया जा रहा है बिना निष्पादित?
बस के रूप में कर्नेल मोड कोड विशेषाधिकार प्राप्त मोड भले ही कोड पहले से उपयोगकर्ता मोड में क्रियान्वित किया गया था में चलता है, तो मुख्य ढेर सूचक (एमएसपी) से मोड कोड रन कर्नेल जाएगा, भले ही प्रक्रिया कोड एक अलग पते का उपयोग कर रहा था अंतरिक्ष।
8 क्या 'प्रीemptणीय कर्नेल' का मतलब केवल यह है कि कर्नेल को इस तरह से डिजाइन किया गया था कि कर्नेल कोड के निष्पादन के दौरान संदर्भ स्विच होना सुरक्षित रहेगा? या अगर किसी को भी करने के लिए और अधिक काम करने की आवश्यकता है?
मुझे लगता है कि इसका मतलब है कि कर्नेल उपयोगकर्ता कोड को प्रीमिट कर सकता है, न कि कर्नेल को ही पूर्ववत किया जा सकता है। कर्नेल को बाधित करने के लिए कुछ भी मुश्किल और असामान्य होगा। इसके लिए और अधिक काम की आवश्यकता होगी, और मैं यह देखने के लिए संघर्ष कर रहा हूं कि आप इसे क्यों चाहते हैं।
एक नज़र से [FAQ] उठाने चाहिए:। "आपके प्रश्न यथोचित scoped किया जाना चाहिए कि आप एक पूरी किताब है कि आपके सवाल का जवाब कल्पना कर सकते हैं, तो आप बहुत ज्यादा पूछ रहे हैं। " यहां बहुत सारे प्रश्न हैं, और दायरा वास्तव में व्यापक है। ऐसा लगता है कि आपको सामान्य रूप से ऑपरेटिंग सिस्टम डिज़ाइन पर एक अच्छी किताब की आवश्यकता है, और विशेष रूप से एआरएम पर एक अच्छा है। – Mat
हां, प्रश्न में उल्लिखित एक पुस्तक एक अच्छी बात होगी। प्रश्नों का दायरा स्वयं इतना व्यापक नहीं है, वे या तो कर्नेल-उपयोगकर्ता के रिडेम्प्शन या रिलेशनशिप के बारे में हैं। हालांकि मुझे डर है कि वे एक ही पोस्ट के लिए बहुत अधिक हैं, इसके लिए खेद है। मैं देखता हूं कि एक मॉड या तो इसे तोड़ने या इसे "हाथ के लिए एक अच्छी प्रणाली डिजाइन पुस्तक की आवश्यकता" जैसे कुछ बदलने के लिए सिफारिश करता है .. – sgupta
पुस्तक अनुशंसा प्रश्न यहां काम नहीं करते हैं। (कुछ ऐतिहासिक लोग हैं जो चारों ओर चिपकते हैं, लेकिन नए लोगों का स्वागत नहीं है।) – Mat