2012-07-22 28 views
6

एक छोटी सी परिचय,अंतर स्विच

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

सभी सवालों का जवाब दे देते हैं अगर आप अधिमानतः जो यूज़रस्पेस को लागू करने और preemptible (लेकिन जटिल linux की तरह नहीं) कर रहे हैं हाथ के लिए मुझे एक स्वतंत्र रूप से उपलब्ध RTOS (या यहां तक ​​कि एक नि: शुल्क पुस्तक) का उल्लेख किया जा सकता करने के लिए एक बेहतर विकल्प। लिनक्स में अब तक के सबसे खराब दस्तावेज हैं जो मैंने देखा है (मैंने लिनक्स कोड से चीज़ों को समझने का प्रयास किया है, लेकिन दस लाख फाइलों के माध्यम से बिखरी हुई परिभाषाएं हैं और विचित्र नामों के साथ फ़ंक्शन हुक और सामान को हर संस्करण का नाम बदलना भी है कभी-कभी चले गए ...)

  1. "प्रीम्प्शन" और "संदर्भ स्विच" के बीच क्या अंतर है?

  2. प्रीपेप्टिव और अपरिवर्तनीय कर्नेल के बीच महत्वपूर्ण अंतर क्या हैं? कर्नेल प्रीपेप्टिव बनाने के लिए प्रोग्रामर से सभी कामों की क्या आवश्यकता है?

  3. उपयोगकर्ता मोड के साथ कैसे बनाएं और काम करें?

    एआरएम दस्तावेज़ कहते हैं कि उपयोगकर्ता मोड में, किसी विशेषाधिकार प्राप्त मोड में स्विच करने के लिए कोई भी निर्देश अपरिभाषित निर्देश के रूप में माना जाएगा।

  4. यदि ऐसा है, तो उपयोगकर्ता कोड प्रोग्राम के लिए कर्नेल कोड का उपयोग करने का एकमात्र तरीका सिस्को है?

  5. कर्नेल उपयोगकर्ता के साथ प्रतिक्रिया या बातचीत कैसे करता है?

  6. क्या इसका मतलब यह है कि बूटिंग (सरल प्रणाली में) के बाद केवल कर्नेल थ्रेड निष्क्रिय धागा होगा?

  7. यदि उपयोगकर्ता प्रक्रिया में स्विच करते समय कर्नेल कोड और डेटा रहता है, तो पृष्ठ को सिंकल या इंटरप्ट पर, कर्नेल कोड वर्चुअल एड्रेस स्पेस में मैप किए बिना निष्पादित करता है?

  8. क्या 'प्रीपेप्टिबल कर्नेल' का मतलब केवल यह है कि कर्नेल को इस तरह से डिज़ाइन किया गया था कि कर्नेल कोड के निष्पादन के दौरान संदर्भ स्विच होना सुरक्षित रहेगा? या अगर किसी को भी करने के लिए और अधिक काम करने की आवश्यकता है?

ओह और यदि ऐसे कई प्रश्नों की अनुमति नहीं है, तो क्षमा करें, इसके बारे में कुछ भी नहीं मिला।

+3

एक नज़र से [FAQ] उठाने चाहिए:। "आपके प्रश्न यथोचित scoped किया जाना चाहिए कि आप एक पूरी किताब है कि आपके सवाल का जवाब कल्पना कर सकते हैं, तो आप बहुत ज्यादा पूछ रहे हैं। " यहां बहुत सारे प्रश्न हैं, और दायरा वास्तव में व्यापक है। ऐसा लगता है कि आपको सामान्य रूप से ऑपरेटिंग सिस्टम डिज़ाइन पर एक अच्छी किताब की आवश्यकता है, और विशेष रूप से एआरएम पर एक अच्छा है। – Mat

+0

हां, प्रश्न में उल्लिखित एक पुस्तक एक अच्छी बात होगी। प्रश्नों का दायरा स्वयं इतना व्यापक नहीं है, वे या तो कर्नेल-उपयोगकर्ता के रिडेम्प्शन या रिलेशनशिप के बारे में हैं। हालांकि मुझे डर है कि वे एक ही पोस्ट के लिए बहुत अधिक हैं, इसके लिए खेद है। मैं देखता हूं कि एक मॉड या तो इसे तोड़ने या इसे "हाथ के लिए एक अच्छी प्रणाली डिजाइन पुस्तक की आवश्यकता" जैसे कुछ बदलने के लिए सिफारिश करता है .. – sgupta

+0

पुस्तक अनुशंसा प्रश्न यहां काम नहीं करते हैं। (कुछ ऐतिहासिक लोग हैं जो चारों ओर चिपकते हैं, लेकिन नए लोगों का स्वागत नहीं है।) – Mat

उत्तर

11

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

1 "प्रीम्प्शन" और "संदर्भ स्विच" के बीच क्या अंतर है?

मोचन इसकी भागीदारी के बिना प्रक्रिया में बाधा डालने का कार्य है। इस संदर्भ में, शायद इसका मतलब है कि एक टाइमर बाधा आग लग जाएगी।यह शब्द preemption: की कानूनी अवधारणा से आता है जो दूसरों के सामने या पहले दावा करने या खरीदने का कार्य या अधिकार है। आपके उद्देश्यों के लिए, इसका मतलब है कि जब टाइमर आग को बाधित करता है, तो इंटरप्ट सेवा दिनचर्या (आईएसआर) को उस कोड पर प्राथमिकता होती है जो पहले चल रहा था। इसमें कर्नेल को बिल्कुल शामिल करने की आवश्यकता नहीं है; आपके पास किसी भी आईएसआर में कोड चल रहा है जो प्रीपेप्टिव रूप से चलाएगा।

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

2 प्रीपेप्टिव और अपरिवर्तनीय कर्नेल के बीच महत्वपूर्ण अंतर क्या हैं? कर्नेल प्रीपेप्टिव बनाने के लिए प्रोग्रामर से सभी कामों की क्या आवश्यकता है?

एक प्रीपेप्टिव कर्नेल में, किसी भी दो असेंबली निर्देशों (जिसे 'अनुक्रम बिंदु' के नाम से जाना जाता है) के बीच एक बाधा उत्पन्न हो सकती है। एक गैर-प्रीपेप्टिव कर्नेल में, चलने वाली प्रक्रिया को yield() फ़ंक्शन को अन्य थ्रेड चलाने की अनुमति देने के लिए कॉल करना होगा। प्रीपेप्टिव कर्नल अधिक जटिल हैं, लेकिन समेकन का बेहतर भ्रम प्रदान करते हैं। गैर-प्रीपेप्टिव कर्नेल setjmp.h के साथ बहुत आसानी से किए जा सकते हैं, लेकिन प्रत्येक थ्रेड को नियमित रूप से yield() पर कॉल करना होगा या अन्य थ्रेड नहीं चलेंगे।

जब yield() जैसे फ़ंक्शन को कॉल किया जाता है, प्रोसेसर की स्थिति स्वचालित रूप से संग्रहीत होती है। जब आप अपना ओएस प्रीपेप्टिव बनाना चाहते हैं, तो आपको यह जानकारी मैन्युअल रूप से स्टोर करनी होगी।

3 उपयोगकर्ता मोड के साथ कैसे बनाएं और काम करें?

एआरएम दस्तावेज़ कहते हैं कि उपयोगकर्ता मोड में, किसी विशेषाधिकार प्राप्त मोड में स्विच करने के लिए कोई भी निर्देश अपरिभाषित निर्देश के रूप में माना जाएगा।

सही। हालांकि, वे यह भी कहते हैं कि कोई भी बाधा स्वचालित रूप से विशेषाधिकार प्राप्त मोड में चली जाएगी। एआरएम सिस्टम पर, आप सॉफ़्टवेयर बाधा उत्पन्न करने के लिए svc निर्देश का उपयोग कर सकते हैं। एसवीसी कोड (आपके ओएस का हिस्सा) फिर विशेषाधिकार प्राप्त मोड में चलाने में सक्षम होगा।

4 यदि ऐसा है, तो उपयोगकर्ता कोड प्रोग्राम के लिए कर्नेल कोड का उपयोग करने का एकमात्र तरीका सिस्को है?

सही। कम से कम, यह एकमात्र सुरक्षित या सही तरीका है।

5 कर्नेल उपयोगकर्ता के साथ प्रतिक्रिया या बातचीत कैसे करता है?

एआरएम पर, एसवीसी निर्देश 8-बिट मान प्राप्त कर सकता है। इसका उपयोग उपज जैसे 256 सिस्को, इंटरप्ट सक्षम करने, इंटरप्ट अक्षम करने, या जो भी आपको चाहिए, उत्पन्न करने के लिए किया जा सकता है। यदि आपको इसकी आवश्यकता हो तो आप एक साझा मेमोरी या संदेश पारित करने के लिए संदेश भी चुन सकते हैं।

6 क्या इसका मतलब यह है कि बूटिंग (सरल प्रणाली में) के बाद केवल कर्नेल थ्रेड निष्क्रिय धागा होगा?

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

7 यदि पृष्ठ कर्नेल कोड जब एक syscall पर एक उपयोगकर्ता प्रक्रिया का उपयोग करने जा, तो या बीच में और डेटा रहता है तुच्छ है, कैसे करता है कर्नेल कोड वर्चुअल ऐड्रेस स्पेस में मैप किया जा रहा है बिना निष्पादित?

बस के रूप में कर्नेल मोड कोड विशेषाधिकार प्राप्त मोड भले ही कोड पहले से उपयोगकर्ता मोड में क्रियान्वित किया गया था में चलता है, तो मुख्य ढेर सूचक (एमएसपी) से मोड कोड रन कर्नेल जाएगा, भले ही प्रक्रिया कोड एक अलग पते का उपयोग कर रहा था अंतरिक्ष।

8 क्या 'प्रीemptणीय कर्नेल' का मतलब केवल यह है कि कर्नेल को इस तरह से डिजाइन किया गया था कि कर्नेल कोड के निष्पादन के दौरान संदर्भ स्विच होना सुरक्षित रहेगा? या अगर किसी को भी करने के लिए और अधिक काम करने की आवश्यकता है?

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

+0

कर्नेल छूट वास्तव में महत्वपूर्ण है (मैं विशेष रूप से रीयल-टाइम सिस्टम के लिए दांव लगाऊंगा)। http://www.linuxjournal.com/article/5600 – Mat

+0

संतोषजनक उत्तर हालांकि मैं अभी भी 7 में नहीं समझता, मैंने पूछा कि यदि वर्चुअल स्पेस में कर्नेल कोड मैप नहीं किया गया है, तो सीपीयू वहां से कोड कैसे लाता है? क्या डेटा को निरस्त नहीं करना चाहिए? 8 में, चूंकि यह एक मोनोलिथिक कर्नेल है, इसलिए मैं कर्नेल में "सबसे अधिक" सामग्री को कार्यान्वित कर रहा हूं, इसलिए मुझे वास्तव में कर्नेल कोड को पूर्व emtive बनाने की आवश्यकता होगी, मान लीजिए कि मुझे स्पिनलॉक अधिग्रहण syscall मिलता है या कुछ कर्नेल थ्रेड इसे एक ही CPU पर कॉल करता है , एक डेडलॉक की ओर ले जाएगा, लेकिन अगर उस थ्रेड को छूट दी गई थी, तो यह किसी भी सिस्टम पर ठीक चल जाएगी क्योंकि थ्रेड को इसके सभी क्वांटम का उपयोग करने के बाद बाहर निकाला जाएगा। – sgupta

+0

@ user1075375 - 7 - नहीं, इससे डेटा निरस्त नहीं होगा क्योंकि सीपीयू विशेषाधिकार प्राप्त मोड में चल रहा है। कम से कम, मैं इसे समझता हूं - मैं मानता हूं कि मेरा अधिकांश काम एमएमयू या वर्चुअल मेमोरी के बिना सिस्टम पर किया गया है। पुन 8 - यदि आपके पास एकाधिक सीपीयू हैं, तो हाँ, यह उपयोगी होगा अगर कर्नेल कोड प्रीemptable था। हालांकि, यू को मौजूदा सीपीयू से स्पिनलॉक अधिग्रहण syscall नहीं मिल सकता है - जब कर्नेल कोड चल रहा है, तो उपयोगकर्ता कोड नहीं चल रहा है। –

1

बल्कि अपने प्रगणित प्रत्येक प्रश्न का जवाब देने से, मैं अपने सर्वश्रेष्ठ प्रयास करेंगे अपने (शुक्र) बोल्ड अनुरोध की सेवा से:

सभी सवालों का जवाब दे देते हैं अगर आप का उल्लेख किया जा सकता करने के लिए एक बेहतर विकल्प मुझे एक स्वतंत्र रूप से उपलब्ध RTOS (या यहां तक ​​कि एक नि: शुल्क पुस्तक) बांह के लिए अधिमानतः

Micrium के uC/ओएस-III एक प्राथमिकता के आधार पर रियल-टाइम कर्नल कि (बेशक) सिंक्रोनस और एसिंक्रोनस दोनों पूर्वक्रय समर्थन करता है। और, भाग्य के रूप में यह होगा (और कारण मैं जवाब दे रहा हूं) यह है कि एक मुफ्त पुस्तक उपलब्ध है, और स्रोत कोड भी उपलब्ध है।

main page for uC/OS-III पर जाएं और बाईं ओर आपको स्रोत कोड उपलब्धता ("यूसी/ओएस-III स्रोत उपलब्ध है") के बारे में बात करने वाले वीडियो के लिए एक लिंक दिखाई देगा।

जहाँ तक पुस्तकों का सवाल है, projects page के लिए खत्म हो जाना, और पुस्तक है कि सबसे निकट अपने लक्ष्य से मेल खाता है चुनें। सामग्री का 9 0% वही है; केवल सीपीयू-विशिष्ट सामान (संदर्भ स्विचिंग की तरह, & प्रारंभ व्यवधान) पुस्तक बुक करने के लिए अलग-अलग होगा।

आप किताब & कोड डाउनलोड करने के लिए रजिस्टर करने के लिए होगा, मेरे लिए उचित लगता है।

गुड लक और मजा। अपने अंतिम अनुरोध/लक्ष्य को बोल्ड करने के लिए धन्यवाद, जिसने इसे इतना आसान बना दिया।

+0

धन्यवाद, उसमें भी देखेंगे। – sgupta

1

मैं इस धारणा के तहत था कि यूसी/ओएस-III मुक्त नहीं था, लेकिन लाइसेंस प्राप्त था।

एक महान मुफ्त आरटीओएस, और बहुत अच्छी तरह से समझाया गया है, फ्रीआरटीओएस (http: //www.freertos है।org /)

आप निश्चित रूप से वहाँ

+0

यूसी/ओएस वाणिज्यिक उत्पादों में * लाइसेंस * के लिए स्वतंत्र नहीं है और कभी नहीं रहा है।मूल्य निर्धारण (से मैं क्या सुना है) विभिन्न उत्पाद/उत्पाद लाइन/CPU/साइट के लिए [लाइसेंस] (http://micrium.com/page/products/licensing_pricing) $ 20k के लिए $ 10k से लेकर। हालांकि, यह हमेशा स्रोत से उपलब्ध हो गया है और किताब शानदार है (हाँ, मुझे लगता है कि यह FreeRTOS की तुलना में बेहतर दस्तावेज़ीकरण किया गया है); जीन लैब्रोसे शिक्षा और खुलेपन के बारे में महान है। –

+0

मैं एक संपादन पोस्ट में यह जानकारी जोड़ने सबमिट किए हैं। –

+0

सुझाव संपादन अस्वीकार कर दिया गया है: http://stackoverflow.com/suggested-edits/327885 –

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