BIOS प्रोग्राम लिखने के लिए किस प्रोग्रामिंग भाषा का उपयोग किया जाता है?


65

जैसा कि मैं समझता हूं, ROM में आयोजित होने वाला BIOS कोड / बिटस्ट्रीम सामान्य होना चाहिए (कई सीपीयू प्रकार या ISIS के साथ काम करना)। इसके अलावा, मैंने वेब पर उल्लेख किया है कि इसके कोड को डंप करना संभव है (और इसे "जुदा करना")।

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

शायद इसमें एक आंतरिक प्रोसेसर है?


9
के संभावित डुप्लिकेट कैसे कंप्यूटर काम करते हैं?
gnat

39
क्रॉस पोस्टिंग काफी खराब है, लेकिन जब यह दोनों संस्करणों में हॉट नेटवर्क के प्रश्नों पर समाप्त होता है, तो यह केवल
मेसन व्हीलर

8
"BIOS कोड / बिटस्ट्रीम जो ROM में आयोजित किया गया है वह सामान्य होना चाहिए (कई सीपीयू प्रकार या आईएसए के साथ काम करता है)।" - मैंने कभी ऐसे BIOS के बारे में नहीं सुना जो कई ISAs के साथ काम करता हो। आपके पास कोई उदाहरण है?
16

6
As I understand, the BIOS code/bitstream that is held in the ROM should be generic (work alongside with multiple CPU types or ISAs). मैं कहता हूँ "नहीं, बस इसके विपरीत"
edc65

11
यह एक प्रश्न के डुप्लिकेट को सामान्य रूप से "हाउ डू कंप्यूटर्स वर्क" के रूप में भी दूर नहीं है। कृपया डूप के रूप में बंद न करें।
एंड्रेस एफ।

जवाबों:


103

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

नब्बे के दशक की शुरुआत में पहले से ही मुख्य रूप से सी में मुख्य रूप से BIOS लिखा जा रहा था। (मैंने नब्बे के दशक में 90% C, 10% विधानसभा में BIOS लिखा था।)

इस दिशा में भी बहुत मदद मिली है:

  • C पुस्तकालय जो एक विशिष्ट वास्तुकला को लक्षित करते हैं और उस वास्तुकला की ख़ासियत से निपटने के लिए कार्य शामिल हैं, उदाहरण के लिए, x86 वास्तुकला के I / O बंदरगाहों से / के लिए बाइट्स पढ़ने / लिखने के लिए कार्य। Microsoft C ने हमेशा उस तरह के सामान के लिए लाइब्रेरी फ़ंक्शंस की पेशकश की है।

  • सी कंपाइलर जो न केवल एक विशिष्ट सीपीयू आर्किटेक्चर को लक्षित करते हैं, बल्कि सी भाषा को एक्सटेंशन भी प्रदान करते हैं जिसका उपयोग आप कोड लिखने के लिए कर सकते हैं जो विशेष सीपीयू सुविधाओं का उपयोग करता है। उदाहरण के लिए, x86 आर्किटेक्चर इंटरप्ट के रूप में जानी जाने वाली चीजों का समर्थन करता है, जो बाधित हैंडलर के रूप में जानी जाने वाली दिनचर्या का आह्वान करता है, और इसके लिए उन्हें विशेष प्रवेश / निकास निर्देश अनुक्रम की आवश्यकता होती है। बहुत शुरुआती दिनों से, Microsoft C ने ऐसे विशेष कीवर्ड का समर्थन किया, जिनका उपयोग आप किसी फ़ंक्शन को एक बाधा हैंडलर के रूप में चिह्नित करने के लिए कर सकते हैं, इसलिए इसे सीधे CPU इंटरप्ट द्वारा लागू किया जा सकता है, इसलिए आपको इसके लिए कोई असेंबली लिखने की आवश्यकता नहीं है।

आजकल मैं यह मानूंगा कि अधिकांश BIOS C ++ में लिखे गए हैं, यदि किसी उच्च स्तर की भाषा में नहीं।

अधिकांश कोड जो BIOS बनाता है, अंतर्निहित हार्डवेयर के लिए विशिष्ट है, इसलिए इसे वास्तव में पोर्टेबल होने की आवश्यकता नहीं है: यह गारंटी है कि यह हमेशा एक ही प्रकार के सीपीयू पर चलेगा। सीपीयू विकसित हो सकता है, लेकिन जब तक यह पिछले संस्करणों के साथ पीछे की संगतता बनाए रखता है, तब भी यह BIOS को अनमॉडिफाइड चला सकता है। इसके अलावा, आप हमेशा जरूरत पड़ने पर किसी भी नए सीपीयू पर मूल रूप से चलने के लिए सी में लिखे गए BIOS के हिस्सों को फिर से जोड़ सकते हैं।

असेंबली की तुलना में उच्च स्तर की भाषाओं में हम BIOS लिखते हैं इसका कारण यह है कि उन्हें इस तरह से लिखना आसान है, इसलिए नहीं कि उन्हें वास्तव में पोर्टेबल होने की आवश्यकता है।


7
हाँ। कभी-कभी आपके पास एक मदरबोर्ड भी हो सकता है जो न केवल एक विशिष्ट सीपीयू वास्तुकला के लिए, बल्कि एक विशिष्ट सीपीयू विक्रेता के लिए भी बाध्य हो। आजकल आप एक x86 मदरबोर्ड खरीद सकते हैं जो केवल Intel x86 CPUs के साथ संगत है, या एक x86 मदरबोर्ड जो केवल AMD x86 CPUs के साथ संगत है। इन मदरबोर्ड में BIOS एक बड़ी डिग्री के समान होगा, क्योंकि दोनों स्थितियों में सीपीयू x86 इंस्ट्रक्शन सेट को समझता है, और अधिकांश पेरिफेरल्स एक समान होते हैं, लेकिन कुछ बाह्य उपकरणों में अंतर होता है, जो कि BIOS के लिए जरूरी है।
माइक नकीस

4
@ चयन एक मदरबोर्ड भौतिक रूप से कैसा दिखता है, इस पर एक करीब से नज़र डालें। CPU सॉकेट में एक निश्चित पिन की व्यवस्था होगी, जो CPU के परिवार के लिए विशिष्ट है जिसे वह स्वीकार करता है। आप शारीरिक रूप से एक Intel P4 को AMD Opteron मदरबोर्ड
Caleth

14
"BIOS" शब्द पीसी के "बेसिक इनपुट / आउटपुट सिस्टम" को संदर्भित करता है, इसलिए, BIOS होने से x86 CPU का तात्पर्य है। IA64 सिस्टम में BIOS के बजाय एक EFI होता है, PowerPC सिस्टम में एक ओपन फ़र्मवेयर सिस्टम या एक मालिकाना एक हो सकता है, Sparc सिस्टम में OFW (या बल्कि OpenBoot) भी होता है, OLPC X0 एक x86- आधारित है जो OFW का उपयोग करता है। यहां तक ​​कि पीसी भी BIOS का उपयोग नहीं करते हैं, उन्होंने (यू) ईएफआई पर स्विच किया है। OB / OFW दिलचस्प है, क्योंकि यह न केवल पोर्टेबल बल्कि क्रॉस-प्लेटफॉर्म के लिए डिज़ाइन किया गया है। OFW ड्राइवर किसी भी OFW सिस्टम पर काम करेंगे , वे CPU ISA की परवाह किए बिना, "राइट वन्स रन एनीवेयर" लिखें।
जर्ग डब्ल्यू मित्तग

14
"आजकल मैं यह मानूंगा कि अधिकांश BIOS C ++ में लिखे गए हैं" मैं जरूरी नहीं मानूंगा कि, यह सच हो सकता है लेकिन मैं उस उद्योग में काम करता हूं और निश्चित रूप से कई बूट लोडर सादे सी में लिखे गए हैं। जो लोग उस तरह का लिखते हैं सामान अक्सर "ओल्ड गार्ड" होते हैं और पूरी तरह से C ++ पर अभी भी भरोसा नहीं करते हैं।
सैम

6
@TomDworzanski: जबकि तकनीकी रूप से BIOS नहीं है (जो विशेष रूप से पुराने 1981 पीसी-सामान को संदर्भित करता है), IEEE-1275 ओपन फ़र्मवेयर के कई कार्यान्वयन (जो स्पार्क पर BIOS के समान भूमिका के लिए उपयोग किया जाता है, पावरपीसी कॉमन हार्डवेयर रेफरेंस प्लेटफ़ॉर्म (उदाहरण के लिए) PowerMac, PowerBook), 100 $ लैपटॉप OLPC X0-1) विधानसभा / C के अलावा अन्य भाषाओं में आंशिक रूप से लिखे गए हैं। OpenBoot , Open Firmware , OpenBIOS सभी होते हैं ...
Jörg W Mittag

11

जबकि सिद्धांत रूप में कोई भी किसी भी भाषा में BIOS लिख सकता है, आधुनिक वास्तविकता अधिकांश BIOS को असेंबली, सी या दो के संयोजन से लिखा जाता है

BIOS को ऐसी भाषा में लिखा जाना चाहिए जो मशीन कोड को संकलित कर सके , जिसे भौतिक हार्डवेयर-मशीन द्वारा समझा जाता है। यह सीधे या मध्यवर्ती-गीत व्याख्या की गई भाषाओं (पर्ल, पायथन, पीएचपी, रूबी, जावा, सी #, जावास्क्रिप्ट, आदि) को BIOS लिखने के लिए उपयुक्त होने के रूप में समाप्त करता है। (हालांकि, सिद्धांत रूप में, इनमें से कोई एक भाषा को या तो सीधे स्थैतिक मशीन कोड के लिए संकलित कर सकता है या किसी को किसी तरह से दुभाषिया को BIOS में एम्बेड कर सकता है। उदाहरण के लिए, जावा के लिए परित्याग GCJ परियोजना है।)

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

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

मूल प्रश्न पर वापस जा रहे हैं, क्योंकि देशी मशीन कोड का उत्पादन करने की आवश्यकता के कारण, एक BIOS को मूल मशीन कोड कंपाइलर द्वारा समर्थित प्रोग्रामिंग भाषा में लागू करना होगा । जबकि ऐसी कई भाषाएं हैं और जब मैं पिछले कुछ दशकों से सुनिश्चित हूं, प्रयोग में कई भाषाओं का उपयोग किया गया है, तो हर खुली BIOS कार्यान्वयन मैं विशेष रूप से C और / या असेंबली के संयोजन पर निर्भर करता है। मुक्त-स्रोत BIOS कार्यान्वयन मैं इस निष्कर्ष के रूप में देखा शामिल OpenBIOS , tinyBIOS , coreboot , इंटेल BIOS , और Libreboot। मैंने कुछ बहुत पुराने BIOS कार्यान्वयनों को भी देखा जो आज भी प्रासंगिक नहीं हैं, लेकिन C और / या असेंबली नियम का भी पालन करते हैं।

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

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

बेशक वहाँ हैं और साथ ही साथ BIOS लिखने के लिए hobbyist परियोजनाओं होंगे। ये भी, इस प्रकार अब तक, सी और / या असेंबली का चयन करते प्रतीत होते हैं। शायद एक दिन अन्य तकनीकों का उपयोग किया जाएगा। लेकिन आज, की पसंद अच्छी तरह से परिभाषित है।


4
यह थोड़ा सा नट-पिकिंग है लेकिन C # और Java की व्याख्या नहीं की जाती है। वे बाइट-कोड के लिए संकलन करते हैं। यह बाइट-कोड है जो तब दुभाषिया द्वारा नियंत्रित किया जाता है। पहले पैराग्राफ के तर्क को नहीं बदलता है।
टॉनी

1
@ यह सही है। मैंने "सीधे या मध्यवर्ती-गीत की व्याख्या की" को थोड़ा और स्पष्ट किया।

@ आमतौर पर एक दुभाषिया के बजाय एक घबराना, जो एक महत्वपूर्ण अंतर है क्योंकि यह संभव है कि जब तक कुछ गतिशील तकनीकों का उपयोग नहीं किया जाता है, तब तक यह सभी के लिए पूर्व-जेइट करना संभव है। इस तरह से .NET भाषाओं या जावा में BIOS लिखना केवल सैद्धांतिक रूप से संभव होगा, यदि कोई ऐसा करता है और सुनिश्चित करता है कि सभी रनटाइम-सपोर्ट उपलब्ध है। मैं ऐसा करने की कोशिशों की कल्पना करता हूं जो किसी भी सुविधा से अधिक बौना होगा।
जॉन हन्ना

1
@ टोननी वास्तव में C # देशी कोड msdn.microsoft.com/en-us/vstudio/dotnetnative.aspx से संकलित है, इसलिए इसे कमजोर / गतिशील भाषाओं की सूची में देखना अजीब है।
डेन

@ डन C # को आमतौर पर मूल कोड में संकलित नहीं किया जाता है। यह .Net मूल उत्पाद, जिसे आप लिंक करते हैं, अभी तक आधिकारिक तौर पर जारी नहीं किया गया है। मैंने जो पढ़ा है, वह एप्लिकेशन कोड और आवश्यक फ्रेमवर्क कोड को एक निष्पादन योग्य में संकलित करेगा। एफएक्यू के अनुसार, इसे शुरुआत में विंडोज स्टोर ऐप पर लक्षित किया जाएगा, इसलिए इसे अधिक व्यापक रूप से समर्थित होने में कुछ समय लग सकता है। यह सब कहा जा रहा है, ऐसा लगता है कि Microsoft भविष्य में कुछ समय के लिए वर्चुअल मशीन मॉडल से दूर जा सकता है अगर सब ठीक हो जाता है।

4

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

लेकिन क्या आप संभवतः विकल्प रोम के बारे में सोच रहे हैं (जिसे कभी-कभी BIOS कहा जाता है, जैसा कि GPU विकल्प ROM के लिए "वीडियो BIOS")?

वास्तविक, विरासत BIOS संगत विकल्प ROM के लिए, वे संभवतः ISA निर्भर निष्पादन योग्य कोड होंगे (फिर से किसी भी भाषा से उत्पन्न जो वांछित वास्तुकला को लक्षित करने के लिए संकलित किया जा सकता है); पीसीआई भी अनुमति देता है कई ISAs के लिए कोड सहित और मेजबान बूट प्रक्रिया के दौरान उचित द्विआधारी छवि का चयन करने के लिए अनुमति देता है।

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

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