C ++ प्रश्नों में OS विकास


9

एक मास्टर की परियोजना के रूप में, मैं एक साधारण ऑपरेटिंग सिस्टम डिजाइन कर रहा हूं। इसे x86 आर्किटेक्चर पर 16-बिट रियल मोड में चलाने के लिए डिज़ाइन किया जा रहा है। आदर्श रूप से, मैं इस OS को C ++ में विकसित करना चाहता हूं, और केवल असेंबली का उपयोग करके जहां आवश्यक हो। इस प्रकार, मेरे पास विधानसभा में एक बूट लोडर है, जो एक कर्नेल को लोड करता है जो C ++ और asm का मिश्रण है। मेरा प्रश्न C ++ का उपयोग करने के संबंध में है। अब तक, यह संकलित है और चल सकता है, लेकिन मैंने किसी भी गतिशील मेमोरी आवंटन का उपयोग नहीं किया है।

यदि मैं C का उपयोग कर रहा था, तो यह मैलोडोक फ़ंक्शंस को लिखने के लिए समझ में आता है जो मेमोरी आवंटन को नियंत्रित करेगा, लेकिन C ++ में नए कीवर्ड का उपयोग किया जाता है। इसलिए...

स्मृति को आवंटित करने के लिए पर्दे के पीछे से 'नया' कैसे काम करता है, और मैं इसे कैसे संभालूंगा?

और एक कोरोलरी के रूप में ...

क्या यह समझ में आता है कि अपने उच्च स्तर के एब्सट्रैक्ट्स का लाभ उठाने के लिए C ++ का उपयोग करने की कोशिश करें? या इसका उपयोग करने के लिए सिरदर्द अधिक होगा और क्या मुझे सी के साथ रहना चाहिए?

कृपया तर्क दें कि यदि आप मानते हैं कि C ++ एक अच्छा विकल्प नहीं होगा।

जवाबों:


9

newकरने के लिए वास्तविक आवंटन बंद कीवर्ड हाथ operator newहै, जो बल्कि के लिए इसी तरह बर्ताव करता है malloc: यह कहीं से स्मृति हो जाता है। कंपाइलर फिर सभी कंस्ट्रक्टर मैजिक करेगा। इसलिए, C ++ कंपाइलर C ++ रनटाइम लीब (या आपके कोड) से अपेक्षा करेगा कि वह एक कार्यान्वयन प्रदान करे operator new

यह निश्चित रूप से कुछ सार के लिए C ++ का उपयोग करने के लिए समझ में आता है। कोई कारण नहीं है कि क्यों एक ओएस को अपना रोल करना चाहिए std::list<>। अपवाद कहीं अधिक तकलीफदेह हैं। बीच में उपयोगी से बेकार सामान के लिए एक ढाल है। std::complex? यह पूरी तरह से काम करता है, लेकिन आपको इसकी आवश्यकता क्यों होगी?


5

C ++ पर C के कई फायदों का रनटाइम सपोर्ट से कोई लेना-देना नहीं है, और उन मामलों में C में लिखे कोड और C ++ में लिखे कोड में वास्तव में कोई अंतर नहीं है। उदाहरण के लिए, रनटाइम के दौरान कुछ भी न करें। वे कुछ भी नहीं करते हैं जो आप बहुत अधिक अतिरिक्त टाइपिंग के साथ नहीं कर सकते हैं। C ++ ऑपरेटिंग सिस्टम लिखने के लिए एक बहुत ही उचित भाषा है, क्योंकि यह आपको आवश्यकता होने पर निम्न-स्तरीय पहुंच प्रदान करता है, सी की तुलना में उच्च-स्तरीय अमूर्त के साथ संयुक्त जब आपको बिट-ट्विडलिंग पर ध्यान केंद्रित करने की आवश्यकता नहीं होती है।

newदो चीजें करता है: यह कहीं से स्मृति प्राप्त करता है, और यह किसी भी आवश्यक निर्माता को चलाता है। मेमोरी पाने में, यह अलग नहीं है malloc


3

शायद यह कोड का एक मोटा विचार देने के लिए उचित होगा जो एक newअभिव्यक्ति के लिए सामान्य रूप से उत्पन्न होता है । यह संकलक द्वारा उत्पन्न होता है, लेकिन यदि आप इसे एक फ़ंक्शन के रूप में कार्यान्वित कर रहे हैं, तो यह कुछ इस तरह दिखाई देगा:

template <class T>
T *new_object() { 
    void *raw_data = ::operator new(sizeof(T));
    return new(raw_data) T;
}

यदि आप इस बात की परवाह करते हैं कि कैसे newकाम करता है, (लगभग) अपरिहार्य अनुवर्ती है कि कैसे deleteकाम करता है:

template <class T>
void delete_object(T const *object) { 
    object->~T();
    ::operator delete(object);
}

जैसा कि अन्य लोग पहले ही बता चुके हैं, ::operator newऔर ::operator deleteबहुत ही बेसिक मेमोरी एलोकेटर हैं। उदाहरण के लिए, एक यूनिक्स जैसी प्रणाली पर वे शायद कुछ कह सकते हैं brkया sbrkस्मृति के बड़े हिस्से को आवंटित कर सकते हैं, और फिर उन बड़े ब्लॉकों से छोटे हिस्से को बाहर कर सकते हैं। अपने स्वयं के ओएस में, आप अभी भी कुछ प्रकार के एनालॉग चाहते हैं sbrkऔर ऐसा - ऐसा कुछ जो अनिवार्य रूप से "मुक्त" के रूप में सभी मेमोरी के साथ शुरू होता है, और आवश्यकतानुसार स्मृति के टुकड़े आवंटित करता है। यह देखते हुए कि आप वास्तविक मोड में काम कर रहे हैं, यह संभवतः काफी सरल होगा - उपलब्ध स्मृति की छोटी मात्रा को देखते हुए, एक व्यावहारिक डिज़ाइन में विस्तृत एल्गोरिदम पर छोटे आकार पर जोर देने की आवश्यकता होती है।


-4

अधिकांश ऑपरेटिंग सिस्टम CI थिंक में लिखे गए हैं। दूसरी ओर यह एक मास्टर प्रोजेक्ट है इसलिए कुछ अलग और दिलचस्प करें।


1
अधिकांश बड़े ऑपरेटिंग सिस्टम शुरू में C ++ उपलब्ध होने से पहले लिखे गए थे। उस विकल्प को सीमित कर दिया। :-)
बो पर्सन

1
कभी-कभी मुझे लगता है कि डाउनवोट संक्रामक हैं।
केविन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.