2010-07-17 1 views
7

में एक बूट लोडर मैंने फ्लॉपी डिस्क पर एक छोटा असेंबली बूट लोडर बनाकर कुछ बार गड़बड़ कर ली है और यह सोच रहा था कि सी ++ में बूट लोडर बनाना संभव है और यदि ऐसा है तो मैं कहां से शुरू कर सकता हूं? मुझे पता है कि मुझे यकीन नहीं है कि यह int main() का भी उपयोग करेगा।सी ++

किसी भी मदद के लिए धन्यवाद।

+0

संभव डुप्लिकेट [सी या सी ++ में बूटलोडर लिखने के लिए?] (Http://stackoverflow.com/questions/1629123/to-write-a-bootloader-in-c-or-c) – sbi

+0

मेरा मानना ​​है इसमे अंतर है। यह पूछता है कि मुझे कैसे आगे बढ़ना चाहिए और दूसरा सी और सी ++ के बीच चुनाव के बारे में है। लेकिन कुछ ओवरलैप है। – kriss

उत्तर

9

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

विधानसभा वास्तव में पहले चरण के लिए एकमात्र विकल्प है, क्योंकि आपको उच्च स्तर के कुछ भी चलाने के लिए एक समझदार वातावरण स्थापित करने की आवश्यकता है। सी कोड चलाने के लिए पर्याप्त करना काफी सरल है - आपको इसकी आवश्यकता है:

  • सही स्थान पर लोड कोड और डेटा;
  • डेटा क्षेत्र का एक अतिरिक्त हिस्सा हो सकता है जो शून्य-प्रारंभिक होना चाहिए;
  • आपको ढेर के लिए स्मृति के उपयुक्त क्षेत्र में स्टैक पॉइंटर को इंगित करने की आवश्यकता है।

फिर आप उचित बिंदु पर कोड में कूद सकते हैं (उदा।main()) और उम्मीद है कि मूल भाषा सुविधाएं काम करेगी। के रूप में इसे और अधिक initialisation यहाँ की जरूरत है, (यह है कि लागू किया गया है हो सकता है या में जुड़े हुए मानक पुस्तकालय के किसी भी सुविधाओं इस स्तर पर अतिरिक्त initialisation आवश्यकता हो सकती है संभव है।)

एक उपयुक्त वातावरण सी ++ के लिए जा रही अधिक प्रयास की आवश्यकता है , और इसमें मूल भाषा सुविधाएं भी हैं जिन्हें रनटाइम समर्थन की आवश्यकता होती है (फिर से, यह लाइब्रेरी सुविधाओं पर विचार करने से पहले है)। इनमें शामिल हैं:

  • स्थिर रचनाकार चल रहे हैं;
  • स्मृति आवंटन new और delete का समर्थन करने के लिए;
  • रन-टाइम प्रकार की जानकारी (आरटीटीआई) के लिए समर्थन;
  • अपवादों के लिए समर्थन;
  • शायद कुछ अन्य चीजें जिन्हें मैं उल्लेख करना भूल गया हूं। जब तक सेल्सियस वातावरण तैयार होकर चलने लगे इनमें से

कोई नहीं होगा, इसलिए कोड संभालती है कि इन या बल्कि कोडांतरक से सी में लिखा जा सकता है (यहां तक ​​कि सी के ++ कि इसके बाद के संस्करण का उपयोग नहीं करता है एक सबसेट में विशेषताएं)।

(समान सिद्धांत एम्बेडेड सिस्टम में लागू होते हैं, और सी ++ का उपयोग करने के लिए ऐसी प्रणालियों के लिए असामान्य नहीं है, लेकिन केवल सीमित तरीके से - जैसे कोई अपवाद और/या आरटीटीआई नहीं क्योंकि रनटाइम समर्थन लागू नहीं किया गया है।)

2

बूटलोडर्स के पास "int main()" नहीं है, जब तक कि आप इसे कॉल करने के लिए असेंबली कोड नहीं लिखते। यदि आप चरण 1 बूटलोडर लिख रहे हैं, तो यह गंभीर रूप से निराश है।

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

+0

यदि यह सी ++ है, तो आप एसटीएल का उपयोग कर सकते हैं। यह कहानी की कहानी है। यदि आप एसटीएल का उपयोग नहीं कर सकते हैं, तो यह सी ++ नहीं है। – Puppy

+0

यदि इसकी पूंछ है तो यह एक कुत्ता है, अगर यह नहीं है कि यह कहानी का कुत्ता अंत नहीं है – kriss

+0

धन्यवाद साइट पर बहुत अच्छी जानकारी है। – nosedive25

2

हां यह संभव है। आपके पास उत्तर और this question

में उपयोगी लिंक हैं और आप here देख सकते हैं, तो एक C++ बूटलोडर उदाहरण है।

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

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

3

यह थोड़ी देर के बाद से मैंने बूटलोडर लिखने के साथ खेला, इसलिए मैं स्मृति से बाहर जा रहा हूं।

एक x86 बूटलोडर के लिए, आपको एक सी ++ कंपाइलर होना चाहिए जो x86 असेंबली को उत्सर्जित कर सकता है, या, कम से कम, आपको 16-बिट असेंबली में अपना खुद का प्रस्ताव लिखना होगा जो CPU को 32-बिट में रखेगा सुरक्षित (या 64-बिट लंबा) मोड, इससे पहले कि आप अपने सी ++ फ़ंक्शंस को कॉल कर सकें।

एक बार ऐसा करने के बाद, आप सी ++ की भाषा सुविधाओं के अधिकांश, यदि नहीं, तो सबसे अधिक उपयोग करने में सक्षम होना चाहिए, जब तक कि आप उन चीजों से दूर रहें जिनके लिए अंतर्निहित libc की आवश्यकता होती है। लेकिन सीआरटी के बिना सबकुछ स्थिर रूप से लिंक करें और आप सुनहरे हैं।