2009-08-28 20 views
6

तो मैं विजुअल स्टूडियो में अपना सी ++ प्रोग्राम लेता हूं, संकलित करता हूं, और यह एक अच्छी छोटी EXE फ़ाइल थूक देगा। लेकिन EXE केवल विंडोज़ पर ही चलेंगे, और मैं इस बारे में बहुत कुछ सुनता हूं कि कैसे सी/सी ++ असेंबली भाषा में संकलित होता है, जो सीधे प्रोसेसर पर चलता है। EXE विंडोज़ की मदद से चलता है, या मेरे पास ऐसा प्रोग्राम हो सकता है जो एक मैक पर चलने वाले निष्पादन योग्य बनाता है। लेकिन क्या मैं असेंबली भाषा में सी ++ कोड संकलित नहीं कर रहा हूं, जो प्रोसेसर विशिष्ट है?मैं एक निश्चित प्रोसेसर आर्किटेक्चर (कुछ ओएस के बजाए) चलाने के लिए निष्पादन योग्य कैसे बना सकता हूं?

मेरे इनसाइट्स:

  1. मेरा अनुमान है कि मैं शायद नहीं हूँ। मुझे पता है कि इंटेल सी ++ कंपाइलर है, तो क्या यह प्रोसेसर-विशिष्ट असेंबली कोड करेगा? EXEs विंडोज़ पर चलते हैं, इसलिए वे ग्राफिक्स पैकेज से लेकर बड़े पैमाने पर .NET ढांचे तक पहले से स्थापित कई चीजों का लाभ उठाते हैं। एक प्रोसेसर-विशिष्ट निष्पादन योग्य रूप से प्रोसेसर के निर्देश सेट के साथ, सचमुच स्क्रैच से शुरू होगा।

  2. क्या यह निष्पादन योग्य फ़ाइल प्रकार होगा? हम खिड़कियां चला रहे हैं और इसे खोल सकते हैं, लेकिन फिर केवल प्रोसेसर पर स्विच नियंत्रित करेंगे? मुझे लगता है कि यह निष्पादन योग्य ऑपरेटिंग सिस्टम की तरह कुछ होगा, इसमें किसी और चीज को बूट करने से पहले इसे चलाने की आवश्यकता होगी, और केवल प्रोसेसर निर्देश "उपयोग" पर सेट होगा।

+3

इंटेल कंपाइलर जो आप सोचते हैं वह नहीं है - यह इंटेल द्वारा लिखा जाने वाला एक और विंडोज (या लिनक्स; वे दोनों बनाते हैं) कंपाइलर है। यह EXEs या मानक लिनक्स बाइनरी बनाता है। –

उत्तर

16

चलो क्या "रन" का अर्थ है के बारे में सोचना ...

कुछ स्मृति में बाइनरी कोड लोड करने के लिए है। यह एक ओएस सुविधा है। .EXE या बाइनरी निष्पादन योग्य फ़ाइल या बंडल या जो भी, एक बहुत ही ओएस-विशिष्ट तरीके से स्वरूपित है ताकि ओएस इसे स्मृति में लोड कर सके।

कुछ को उन बाइनरी कोडों पर नियंत्रण करना है। ओएस, फिर से है।

I/O दिनचर्या (सी ++ में, लेकिन यह ज्यादातर स्थानों में सच है) केवल एक लाइब्रेरी है जो ओएस एपीआई को समाहित करती है। ओएस, यह हर जगह है।

याद दिलाता है।

पुराने दिनों में (हाँ, मैं यह पुराना हूं) मैंने उन मशीनों पर काम किया जिनके पास ओएस नहीं था। हमारे पास सी

हमने मशीनों में बड़ी बाइनरी छवियां बनाने के लिए "असेंबलर" और "लिंकर्स" जैसे टूल का उपयोग करके मशीन कोड लिखा था जिसे हम मशीन में लोड कर सकते थे। हमें इन बाइनरी छवियों को एक दर्दनाक बूटस्ट्रैप प्रक्रिया के माध्यम से लोड करना पड़ा।

हम एक पेंच पेपर-टेप रीडर जैसे आसान डिवाइस को पढ़ने के लिए स्मृति में पर्याप्त कोड लोड करने के लिए फ्रंट पैनल कुंजी का उपयोग करेंगे। यह काफी मानक बूट लिंकिंग लोडर सॉफ्टवेयर का एक छोटा सा टुकड़ा लोड करेगा। (हमने माइलर टेप का इस्तेमाल किया ताकि वह बाहर न लगे।)

फिर, जब हमारे पास यह लिंकिंग लोडर स्मृति में था, तो हम उस टेप को खिला सकते थे जिसे हम पहले असेंबलर के साथ तैयार करते थे।

हमने अपने डिवाइस ड्राइवरों को लिखा है। या हमने पुस्तकालय के दिनचर्या का उपयोग किया जो स्रोत रूप में थे, पेपर टेप पर पेंच किया गया था।

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

बाद में, हमारे पास सरल ओएस था जिसमें सरल एपीआई, सरल डिवाइस ड्राइवर और "फाइल सिस्टम", "संपादक" और "कंपाइलर" जैसी कुछ उपयोगिताएं थीं। यह जोविअल नामक एक भाषा के लिए था, लेकिन हमने कभी-कभी फोरट्रान का भी इस्तेमाल किया।

हमें सीरियल इंटरफ़ेस बोर्डों को सोल्डर करना था ताकि हम किसी डिवाइस में प्लग कर सकें। हमें डिवाइस ड्राइवर लिखना पड़ा।

नीचे रेखा

आप आसानी से सी ++ प्रोग्राम लिख सकते हैं जिन्हें ओएस की आवश्यकता नहीं है।

  1. हार्डवेयर प्रोसेसर्स चिपसेट का हिस्सा हैं जो हार्डवेयर BIOS (या BIOS- जैसी) सुविधाओं के बारे में जानें। अधिकांश आधुनिक हार्डवेयर में रोम में एक साधारण ओएस वायर्ड होता है जो पावर-ऑन सेल्फ-टेस्ट (POST) करता है, कुछ सरल ड्राइवर लोड करता है, और बूट ब्लॉक का पता लगाता है।

  2. जानें कि अपना खुद का बूट ब्लॉक कैसे लिखें। यह पहला उचित "सॉफ़्टवेयर" चीज है जो पोस्ट के बाद लोड हो जाती है। यह सब मुश्किल नहीं है। आप अपने बूट ब्लॉक प्रोग्राम को डिस्क पर मजबूर करने के लिए विभिन्न विभाजन टूल का उपयोग कर सकते हैं और आपके पास हार्डवेयर पर पूर्ण नियंत्रण होगा। कोई ओएस नहीं

  3. जानें कि कैसे GRUB, LILO या BootCamp एक ओएस लॉन्च करता है। यह जटिल नहीं है। एक बार बूट होने के बाद, वे आपके प्रोग्राम को लोड कर सकते हैं और आप बंद और चल रहे हैं। यह थोड़ा आसान है क्योंकि आप उस प्रकार का विभाजन बनाते हैं जो बूट लोडर लोड करना चाहता है। लिनक्स कर्नेल पर अपना आधार बनाएं और आप खुश रहेंगे। यह पता लगाने की कोशिश न करें कि विंडोज बूट कैसे करता है - यह बहुत जटिल है।

  4. ईएलएफ पर पढ़ें। http://en.wikipedia.org/wiki/Executable_and_Linkable_Format

  5. जानें कि डिवाइस ड्राइवर कैसे लिखे गए हैं। यदि आप ओएस का उपयोग नहीं करते हैं, तो आपको डिवाइस ड्राइवर लिखना होगा।

+0

एक परिशिष्ट "आप आसानी से सी ++ प्रोग्राम लिख सकते हैं जिन्हें ओएस की आवश्यकता नहीं है"। आप इसे माइक्रोकंट्रोलर के साथ आसानी से कर सकते हैं, उनमें से अधिकांश (शायद सभी) में सी ++ या कम से कम सी कंपाइलर्स हैं। – vsz

6

समस्या यह है कि ओएस वास्तव में आपके प्रोग्राम शुरू करने के लिए बहुत कुछ करता है। EXE फ़ाइल में हेडर जानकारी है कि विंडोज़ पहचानता है, खुद को EXE फ़ाइल के रूप में पहचानता है। आपका ऐप ओएस के माध्यम से फाइल सिस्टम से मेमोरी आवंटन तक पहुंच से सबकुछ करता है।

लेकिन हां, आप बिना किसी अनुकरण के अन्य प्लेटफॉर्म पर विंडोज/इंटेल के लिए संकलित ऐप्स चला सकते हैं। यदि आप मैक या यूनिक्स पर अपना EXE चलाने के लिए चाहते हैं, तो आपको अपने प्रोग्राम को चलाने के लिए विंडोज़ जो काम करेगा, उसे करने के लिए आपको थोड़ा और सॉफ्टवेयर इंस्टॉल करना होगा - "वाइन" प्रोजेक्ट पर एक नज़र डालें।

1

निश्चित रूप से, वे मौजूद हैं। उन्हें cross compilers कहा जाता है। उदाहरण के लिए, इस तरह मैं एक्सकोड का उपयोग कर आईफोन मंच के लिए प्रोग्राम कर सकता हूं।

एक संबंधित प्रकार का कंपाइलर एक वर्चुअल प्लेटफार्म के लिए संकलित है। That's how Java works

+0

मुझे नहीं लगता कि यही पूछा गया था। सवाल यह था कि निष्पादन योग्य ओएस-विशिष्ट क्या बनाता है। – sleske

0

हां, आप एक निष्पादन योग्य बना सकते हैं जो प्रोसेसर के 'नंगे धातु' पर चलता है। जाहिर है कि ऑपरेटिंग सिस्टम कर्नेल कैसे काम करते हैं। आपको जो मुख्य चीज करने की ज़रूरत है वह निष्पादन योग्य है जो कि पुस्तकालयों का उपयोग नहीं करता है। हालांकि, "कोई पुस्तकालय" प्रतिबंध में सी मानक पुस्तकालय शामिल नहीं है! तो इसका मतलब है कि कोई मॉलोक, कोई प्रिंटफ, इत्यादि नहीं है। आपको मूल रूप से अपना स्वयं का ओएस होना चाहिए और मेमोरी और I/O स्वयं प्रबंधित करना होगा। अनिवार्य रूप से कुछ स्तर पर असेंबली में सीधे काम की उचित आवश्यकता होगी।

आप मुख्य() जैसे कई अन्य विलासिता भी खो देते हैं, जो आपके प्रोग्राम का प्रारंभिक बिंदु नहीं हो सकता है क्योंकि मुख्य() कुछ ऐसा है जो ओएस और सी रनटाइम पर्यावरण द्वारा लगाया जाता है।

+4

आप "लाइब्रेरी" को "गतिशील रूप से लोड लाइब्रेरी" के साथ भ्रमित कर रहे हैं, ऐसा लगता है। वहां प्रत्येक नंगे धातु कंपाइलर (या कम से कम लगभग हर एक) में सी मानक लाइब्रेरी की एक स्थैतिक-लिंक करने योग्य प्रति शामिल है, जो संकलन समय में जुड़ा हुआ है, इसलिए प्रासंगिक कार्य निष्पादन योग्य का हिस्सा बन जाते हैं, और यह ठीक काम करता है। कई हार्डवेयर विक्रेताओं में उनके विशिष्ट हार्डवेयर के साथ बातचीत के लिए अतिरिक्त पुस्तकालय शामिल हैं, और आप टीसीपी/आईपी पुस्तकालयों और यहां तक ​​कि खरीद सकते हैं। कई हार्डवेयर और कंपाइलर विक्रेता बोर्ड के लिए "चालू" से "मुख्य() को आमंत्रित करते हैं" के लिए आवश्यक मूल बूट कोड भी प्रदान करते हैं। –

+0

एक महत्वपूर्ण बात यह है कि यह ऑपरेटिंग सिस्टम को बदल देता है। अधिकांश ओएस चलाने के लिए आवश्यक कुछ हार्डवेयर तक सीधे पहुंच की अनुमति नहीं देते हैं। तो आप एक प्रोग्राम लिख सकते हैं जो विंडोज या लिनक्स को प्रतिस्थापित करता है, लेकिन ऐसा नहीं है जिसे मौजूदा ओएस में चलाया जा सके। (जब तक आप एक ओएस के लिए लिखते हैं, और दूसरों पर अनुकरण नहीं करते)। – KeithB

1

कोई भी दिए गए कंपाइलर/टूलसेट किसी विशेष प्रोसेसर/ओएस संयोजन के लिए कोड उत्पन्न करता है। तो आपका विजुअल स्टूडियो संकलन उदाहरण x86/विंडोज के लिए कोड उत्पन्न करता है। वह .EXE केवल x86/Windows पर चलाएगा और नहीं (उदाहरण के लिए) एआरएम/विंडोज़ (जैसा कि कुछ सेलफोन द्वारा उपयोग किया जाता है)।

आप जिस कंपाइलर को चला रहे हैं उसके अलावा प्रोसेसर/ओएस संयोजन के लिए कोड तैयार करने के लिए आमतौर पर क्रॉस-कंपाइलर के रूप में जाना जाता है। यदि आपके पास एक पूर्ण पेशेवर विजुअल स्टूडियो सदस्यता है, तो आप एआरएम क्रॉस कंपाइलर प्राप्त कर सकते हैं, जो आपको एआरएम/विंडोज .EXE फ़ाइलों का उत्पादन करने की अनुमति देगा जो आपकी डेस्कटॉप मशीन पर नहीं चलेंगे, लेकिन एआरएम/विंडोज आधारित सेलफोन पर चलेंगे या पाल्मटॉप।

3

कंप्यूटर सीपीयू नहीं है। कुछ भी उपयोगी करने के लिए, सीपीयू को स्मृति और आईओ नियंत्रकों और अन्य उपकरणों से जोड़ा जाना है। एक ओएस प्रोग्राम चलाने से उन सभी को सारणित करने का ख्याल रखता है। इसलिए, यदि आप एक प्रोग्राम लिखना चाहते हैं जो ओएस के बिना चलता है, तो आपके प्रोग्राम को ओएस की कम से कम कुछ विशेषताओं को दोहराना होगा: बूट प्रक्रिया के दौरान BIOS से ऊपर लेना, डिवाइस को प्रारंभ करना, डिस्क नियंत्रक के साथ कोड लोड करने के लिए संचार करना और डेटा, उपयोगकर्ता को जानकारी दिखाने के लिए डिस्प्ले कंट्रोलर के साथ संचार, कीबोर्ड नियंत्रक के साथ संचार और माउस इनपुट इत्यादि को पढ़ने के लिए माउस नियंत्रक इत्यादि।

जब तक आप विशेष हार्डवेयर के साथ एम्बेडेड सिस्टम नहीं बना रहे हैं, वहां कोई नहीं है ऐसा करने में इंगित करें। इसके अलावा, आपके प्रोग्राम को चलाने का मतलब यह होगा कि उपयोगकर्ता को अन्य कार्यक्रमों को छोड़ना होगा। हालांकि यह 1 9 84 में एटीएम या वर्डस्टार के लिए स्वीकार्य हो सकता है, लेकिन आजकल लोग संगीत सुनते समय ईमेल जांचने में सक्षम नहीं होते हैं।

5

आप जो बात कर रहे हैं वह एम्बेडेड दुनिया में "नंगे-धातु" एप्लिकेशन के रूप में जाना जाता है। वे एआरएम कॉर्टेक्स-एम 3 जैसी चीजों के लिए बहुत आम हैं जो डेबिट-कार्ड सत्यापनकर्ता बॉक्स या इंटरैक्टिव खिलौने में कहते हैं (कहें) और पूर्ण ऑपरेटिंग सिस्टम चलाने के लिए पर्याप्त मेमोरी या क्षमता नहीं है। इसलिए, एक "एआरएम/लिनक्स" कंपाइलर प्राप्त करने के बजाय जो एआरएम प्रोसेसर पर लिनक्स पर चलाने के लिए एक एप्लीकेशन को संकलित करेगा, आपको एक "एआरएम नंगे-धातु" कंपाइलर मिलता है जो एक ऑपरेटिंग सिस्टम के बिना एआरएम प्रोसेसर पर चलाने के लिए चीजों को संकलित करता है। (मैं x86 के बजाय एआरएम का उपयोग कर रहा हूं, क्योंकि x86 नंगे धातु अनुप्रयोग वास्तव में इन दिनों काफी दुर्लभ हैं।)

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

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

फिर, आपको सीपीयू और रैम के बाहर की चीजों से बातचीत करने की आवश्यकता है। एक ऑपरेटिंग सिस्टम में ऐसा करने के लिए सभी प्रकार के फ़ंक्शन शामिल हैं - डिस्क I/O, स्क्रीन आउटपुट, कीबोर्ड और माउस इनपुट, नेटवर्किंग इत्यादि, आगे, और इसी तरह। एक ऑपरेटिंग सिस्टम के बिना, आपको इसे कहीं और से प्राप्त करना होगा। आप अपने हार्डवेयर निर्माता से पुस्तकालयों में से कुछ प्राप्त कर सकते हैं; उदाहरण के लिए, जिस बोर्ड में हाल ही में खेल रहा था, उसके पास 40x200-पिक्सेल एलईडी स्क्रीन है, और यह उस लाइब्रेरी के साथ आया जिस पर इसे चालू करने और उस पर व्यक्तिगत पिक्सेल मान सेट करने के लिए कोड था। और नेटवर्किंग या व्हाट्नॉट करने के लिए, टीसीपी/आईपी स्टैक और ऐसी चीजों को लागू करने के लिए पुस्तकालयों की बिक्री करने वाली कई कंपनियां हैं।

उदाहरण के लिए, यह एक बुनियादी प्रिंटफ भी करना मुश्किल बनाता है। जब आपके पास एक ऑपरेटिंग सिस्टम है, तो printf केवल ऑपरेटिंग सिस्टम को एक संदेश भेजता है जो कहता है "कंसोल पर यह स्ट्रिंग डालें", और ऑपरेटिंग सिस्टम को कंसोल पर वर्तमान कर्सर की स्थिति मिलती है, और यह सब कुछ पता लगाने के लिए क्या पिक्सल स्क्रीन पर बदलने के लिए, और ऐसा करने के लिए, उन पिक्सल को बदलने के लिए कौन सी सीपीयू निर्देशों का उपयोग करना है।

ओह, और हमने उल्लेख किया कि आपको पहले यह पता लगाना होगा कि प्रोग्राम को सीपीयू में कैसे प्राप्त किया जाए? एक ठेठ कंप्यूटर में कुछ प्रोग्राम करने योग्य रॉम होता है जो इसे शुरू होने से निर्देश लोड करेगा। एक x86 पर, यह BIOS है, और इसमें आमतौर पर पहले से ही एक आसान प्रोग्राम होता है जो सीपीयू शुरू करता है, डिस्प्ले सेट करता है, डिस्क की तलाश करता है, और डिस्क को उस डिस्क से लोड करता है जो इसे पाता है। एक एम्बेडेड सिस्टम पर, आमतौर पर आपका प्रोग्राम कहां जाता है - जिसका अर्थ है कि आपको अपना प्रोग्राम वहां रखने के लिए कुछ तरीका चाहिए। अक्सर, इसका मतलब है कि आपके पास "डीबगर" नामक एक उपकरण है जो प्रोग्राम को लोड करने वाले आपके एम्बेडेड बोर्ड से शारीरिक रूप से जुड़ा हुआ है - और यह भी चीजें कर सकता है जो आपको प्रोसेसर को रोकने और यह निर्धारित करने की अनुमति देता है कि उसका राज्य क्या है, ताकि आप कदम उठा सकें अपने प्रोग्राम के माध्यम से जैसे कि आप इसे अपने कंप्यूटर पर एक सॉफ्टवेयर डीबगर में चला रहे थे। लेकिन मैं पीछे हटा।

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

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

फ्रीआरटीओएस सिस्टम एक ओपन-सोर्स आरटीओएस है जो आरटीओएस स्पेस के छोटे छोर की तरफ है; यदि आप अधिक रुचि रखते हैं तो वे इनमें से कुछ को देखने के लिए एक अच्छी जगह हो सकते हैं। उनके पास x86 अनुप्रयोगों के कुछ उदाहरण हैं, जो आपको एक विचार देंगे कि किस तरह के x86 सिस्टम एक नंगे धातु या आरटीओएस-आधारित प्रोग्राम चलाएंगे और आप किसी पर चलाने के लिए कुछ कैसे संकलित करेंगे; यहां लिंक करें: http://www.freertos.org/a00090.html#186

0

बिल्कुल! एम्बेडेड प्रोग्रामिंग यही है। जैसा कि कई ने शायद पहले ही कहा है कि ऑपरेटिंग सिस्टम आपके लिए काफी कुछ करता है। और यहां तक ​​कि एक ऑपरेटिंग सिस्टम के बिना एम्बेडेड दुनिया में भी कई विकास उपकरण प्रोसेसर को आपके प्रोग्राम पर कूदने के लिए पर्याप्त चलने के लिए स्टार्टअप कोड प्रदान करेंगे। कुछ/कई पूर्ण झटका सी/सी ++ पुस्तकालय प्रदान करते हैं ताकि आप memcpy() और कभी-कभी malloc() और printf() जैसे कार्यों को कॉल कर सकें।

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

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

0

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

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

0

विंडोज पुस्तकालयों के बारे में भी मत भूलना। क्यूटी और जीटीके +

+1

एसओ में आपका स्वागत है। यह शायद एक टिप्पणी के रूप में सबसे अच्छा छोड़ दिया जाएगा क्योंकि यह पूरी तरह से पूछे गए सवाल का जवाब नहीं देता है। –