लिनक्स कर्नेल खुद को कैसे संकलित कर सकता है?


88

जब मैं अपनी मशीन पर लिनक्स सिस्टम स्थापित करता हूं तो मुझे लिनक्स कर्नेल की संकलन प्रक्रिया समझ में नहीं आती है।

यहाँ कुछ चीजें हैं जो मुझे भ्रमित करती हैं:

  1. कर्नेल C में लिखा गया है, हालाँकि कर्नेल बिना संकलित किए संकलित कैसे हुआ?
  2. यदि कर्नेल संकलित होने से पहले मेरी मशीन पर सी कंपाइलर स्थापित है, तो संकलक बिना संकलित किए संकलित कैसे हो सकता है?

मैं कुछ दिनों के लिए उलझन में था, प्रतिक्रिया के लिए धन्यवाद।


जहाँ तक पता है कि सी-कंपाइलर किसी पागल और चालाक लोगों द्वारा किसी दिए गए कंप्यूटर के लिए UNIX को संकलित करने के लिए AT & T लैब में कुछ पागल और चतुर लोगों द्वारा लिखा गया था (कृपया ध्यान दें कि इतिहास UNIX के साथ भीख माँगता है, न कि linux से, इसलिए मैं आपसे डरता हूँ एक अध्याय याद आती है ... या उनमें से कई!)। सबसे छोटी बात यह है कि विभिन्न कंप्यूटरों के लिए यूनिक्स कर्नेल को फिर से लिखने की आवश्यकता नहीं थी क्योंकि उन कंप्यूटरों में सी भाषा के लिए एक उचित संकलक होता है। उन कंपाइलरों को लक्ष्य कंप्यूटर के विशिष्ट असेंबलर में लिखा गया था। रफ्टी ने कहा "पहले कंपाइलर दिए गए कंप्यूटर के असेंबलर में लिखा है, फिर UNIX में सी लिखा है"
विक्टर

जवाबों:


208

आपके लिनक्स बॉक्स के लिए बायनेरिज़ का पहला दौर कुछ अन्य लिनक्स बॉक्स (शायद) पर बनाया गया था।

पहले लिनक्स सिस्टम के लिए बायनेरिज़ किसी अन्य प्लेटफ़ॉर्म पर बनाए गए थे ।

उस कंप्यूटर के लिए बायनेरिज़ एक मूल सिस्टम पर अपनी जड़ का पता लगा सकता है जो अभी तक किसी अन्य प्लेटफॉर्म पर बनाया गया था ।

...

इसे बहुत दूर धकेलें, और आपको अधिक आदिम उपकरणों के साथ निर्मित कंपाइलर मिलें, जो बदले में उनके मेजबान के अलावा मशीनों पर बनाए गए थे।

...

धक्का लगाते रहें और आप कंप्यूटर का निर्माण करें ताकि मशीन के फ्रंट पैनल पर स्विच स्थापित करके उनके निर्देशों को दर्ज किया जा सके ।

बहुत मस्त माल।

नियम है "उपकरण बनाने के लिए उपकरण बनाने के लिए उपकरण का निर्माण ..."। हमारे भौतिक पर्यावरण को चलाने वाले औजारों को बहुत पसंद करते हैं। इसे "बूटस्ट्रैप्स द्वारा खुद को ऊपर खींचने" के रूप में भी जाना जाता है।


3
जरूरी नहीं कि अशुद्ध हो। बस अडिग है। पहले संकलक को 386 पर काम करने के लिए ऑप्टिमाइज़ किया जाएगा, लेकिन आपके पास जो भी आर्किटेक्चर है, उसके लिए पुन: संकलित संस्करण को ऑप्टिमाइज़ किया गया है।
ब्रेटन

1
आप एक तीसरा चरण जोड़ सकते हैं, अगर सब कुछ ठीक है दूसरे चरण का उत्पादन तीसरे चरण के आउटपुट के बराबर होना चाहिए।
इस्माइल

27
यह सिर्फ सॉफ्टवेयर नहीं है, यह हार्डवेयर है। कंप्यूटर के बिना P4 (या यहां तक ​​कि 486) जैसा कुछ भी नहीं हो सकता है।
BCS

1
@ BCS: ओह, हाँ। हम इस बिंदु पर पहुंच गए हैं कि सॉफ्टवेयर और हार्डवेयर उपकरण गहराई से परस्पर और अन्योन्याश्रित हैं।
dmckee --- पूर्व-संचालक बिल्ली का बच्चा

4
"एक जटिल प्रणाली जो काम करती है वह हमेशा एक साधारण प्रणाली से विकसित होती है जो काम करती है।" en.wikipedia.org/wiki/Gall_law
ajuc

33

मुझे लगता है कि आपको इसमें अंतर करना चाहिए:

संकलित , v: स्रोत कोड को संसाधित करने और निष्पादन योग्य कोड बनाने के लिए एक संकलक का उपयोग करने के लिए [1]

तथा

स्थापित करें , वी: कनेक्ट करने के लिए, सेट करें या उपयोग के लिए कुछ तैयार करें [2]

संकलन स्रोत कोड से द्विआधारी निष्पादन योग्य बनाता है। स्थापना केवल उन बाइनरी निष्पादनयोग्य को बाद में चलाने के लिए सही जगह पर रखती है। यदि बायनेरिज़ उपलब्ध हैं, तो स्थापना और उपयोग के लिए संकलन की आवश्यकता नहीं है। "संकलन" और "स्थापित" के बारे में "कुक" और "सेवा" के बारे में सोचें, इसी के बारे में सोचें।

अब, आपके प्रश्न:

  1. कर्नेल C में लिखा गया है, हालाँकि कर्नेल बिना संकलित किए संकलित कैसे हुआ?

कर्नेल को संकलक के बिना संकलित नहीं किया जा सकता है, लेकिन इसे संकलित बाइनरी से स्थापित किया जा सकता है

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

यहाँ तक कि "सोर्स-बेस्ड" डिस्ट्रीब्यूशन में जेंटू की तरह आप एक संकलित बाइनरी को चलाने से शुरू करते हैं।

इसलिए, आप अपने पूरे जीवन को गुठली के संकलन के बिना जी सकते हैं, क्योंकि आपने उन्हें किसी और के द्वारा संकलित किया है।

  1. यदि कर्नेल संकलित होने से पहले मेरी मशीन पर सी कंपाइलर स्थापित है, तो संकलक बिना संकलित किए संकलित कैसे हो सकता है?

कंपाइलर (OS) नहीं होने पर कंपाइलर को नहीं चलाया जा सकता है। तो एक को संकलक को चलाने के लिए एक संकलित कर्नेल स्थापित करना होगा , लेकिन कर्नेल को स्वयं संकलित करने की आवश्यकता नहीं है ।

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

अब, चिकन और अंडे की समस्या। पहला बाइनरी किसी और द्वारा संकलित किया गया है ... dmckee द्वारा एक उत्कृष्ट उत्तर देखें।


14

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

उनका सॉफ्टवेयर एक डेस्कटॉप मशीन पर विकसित किया गया है और फिर इसे संकलित किए जाने के बाद कॉपी किया गया है।

अगर इस तरह की चीज़ों से आपको दिलचस्पी है, तो मेरे दिमाग में सबसे ऊपर एक लेख आता है: रिफ्लेक्शंस ऑन ट्रस्टिंग ट्रस्ट ( पीडीएफ ), यह एक क्लासिक और एक मज़ेदार रीड है।


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

12

कर्नेल खुद को संकलित नहीं करता है - यह उपयोगकर्ताओं द्वारा सी कंपाइलर में संकलित किया जाता है। अधिकांश सीपीयू आर्किटेक्चर में, सीपीयू के पास विशेष रजिस्टरों में कई बिट्स होते हैं जो यह दर्शाते हैं कि वर्तमान में चल रहे कोड क्या विशेषाधिकार हैं। X86 में, ये कोड सेगमेंट (CS) रजिस्टर में वर्तमान विशेषाधिकार स्तर बिट्स (CPL) हैं । यदि CPL बिट्स 00 हैं, तो कोड को सुरक्षा रिंग 0 में चलने वाला कहा जाता है, जिसे कर्नेल मोड के रूप में भी जाना जाता है । यदि CPL बिट्स 11 हैं, तो कोड को सुरक्षा रिंग 3 में चलाने के लिए कहा जाता है, जिसे उपयोगकर्ता मोड के रूप में भी जाना जाता है । अन्य दो संयोजन, 01 और 10 (सुरक्षा के छल्ले 1 और 2 क्रमशः) शायद ही कभी उपयोग किए जाते हैं।

उपयोगकर्ता मोड बनाम कर्नेल मोड में कोड क्या कर सकता है और नहीं कर सकता इसके बारे में नियम बल्कि जटिल हैं, लेकिन यह कहना पर्याप्त है कि उपयोगकर्ता मोड ने विशेषाधिकारों को कम कर दिया है।

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

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

लिनक्स के मामले में, कर्नेल में दो भाग होते हैं: कर्नेल का स्रोत कोड और कर्नेल का संकलित निष्पादन योग्य। C कंपाइलर वाली कोई भी मशीन कर्नेल को सोर्स कोड से बाइनरी इमेज में संकलित कर सकती है। प्रश्न, फिर, उस बाइनरी छवि के साथ क्या करना है।

जब आप एक नई प्रणाली पर लिनक्स स्थापित करते हैं, तो आप एक प्री-कम्पोज्ड बाइनरी इमेज को स्थापित कर रहे हैं, आमतौर पर या तो भौतिक मीडिया (जैसे कि सीडी डीवीडी) या नेटवर्क से। BIOS मीडिया या नेटवर्क से कर्नेल के बूटलोडर की (द्विआधारी छवि) को लोड करेगा, और फिर बूटलोडर आपकी हार्ड डिस्क पर कर्नेल की (द्विआधारी छवि) स्थापित करेगा। फिर, जब आप रिबूट करते हैं, तो BIOS आपकी हार्ड डिस्क से कर्नेल के बूटलोडर को लोड करता है, और बूटलोडर कर्नेल को मेमोरी में लोड करता है, और आप बंद और चल रहे हैं।

यदि आप अपनी खुद की गिरी को फिर से जोड़ना चाहते हैं , तो यह थोड़ा मुश्किल है, लेकिन यह किया जा सकता है।


5

पहले कौन सा था? मुर्गी या अंडा?

डायनासोर के समय से ही अंडे रहे हैं।

.. कुछ कहकर सब कुछ भ्रमित कर देते हैं कि मुर्गियां वास्तव में महान प्राणियों की संतान हैं .. लंबी कहानी छोटी: वर्तमान उत्पाद (चिकन) से पहले तकनीक (अंडाणु) मौजूद थी

आपको कर्नेल बनाने के लिए एक कर्नेल की आवश्यकता होती है, अर्थात आप एक दूसरे के साथ निर्माण करते हैं।

पहला कर्नेल वह कुछ भी हो सकता है जो आप चाहते हैं (अधिमानतः कुछ समझदार जो आपका वांछित अंतिम उत्पाद बना सकता है ^ __ ^)

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

अर्थ: आप एक कर्नेल को किसी जगह पर लिखते और संकलित करते हैं, और इसे एक खाली (ओएस) वर्चुअल मशीन पर पढ़ते हैं।

उन लिनक्स इंस्टॉल के साथ क्या होता है, जोड़ा जटिलता के साथ एक ही विचार का पालन करता है।


5

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

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

आप लिनक्स को स्क्रैच प्रोजेक्ट से देख सकते हैं । आप वास्तव में पुस्तक में दो प्रणालियों का निर्माण करते हैं: एक "अस्थायी प्रणाली" जो एक ऐसी प्रणाली पर बनाई गई है जिसे आपने स्वयं नहीं बनाया था, और फिर "LFS प्रणाली" जो आपके अस्थायी सिस्टम पर बनाया गया है। वर्तमान में पुस्तक जिस तरह से लिखी गई है, आप वास्तव में एक अन्य लिनक्स बॉक्स पर अस्थायी प्रणाली का निर्माण करते हैं, लेकिन सिद्धांत रूप में आप इसे पूरी तरह से अलग ओएस पर अस्थायी प्रणाली बनाने के लिए अनुकूलित कर सकते हैं।


1

अगर मैं आपके सवाल को सही तरीके से समझ रहा हूँ। कर्नेल इन दिनों "खुद को संकलित" नहीं कर रहा है। अधिकांश लिनक्स वितरण आज एक लिनक्स लाइव सीडी के माध्यम से सिस्टम इंस्टालेशन प्रदान करते हैं। कर्नेल को सीडी से मेमोरी में लोड किया जाता है और इसे सामान्य रूप से संचालित किया जाता है जैसे कि यह डिस्क पर इंस्टॉल किया गया हो। एक Linux वातावरण के साथ और आपके सिस्टम पर चलने के साथ यह आवश्यक है कि आप अपनी डिस्क पर आवश्यक फाइलों को कमिट करें।

यदि आप बूटस्ट्रैपिंग मुद्दे के बारे में बात कर रहे थे; dmckee ने इसे बहुत अच्छा बताया।

बस एक और संभावना की पेशकश ...

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