अन्य प्लेटफ़ॉर्म आवश्यकताओं के लिए लिनक्स को पोर्ट करना [बंद]


28

मुझे पता है कि लिनक्स उपलब्ध है और इसे कई अलग-अलग प्लेटफार्मों जैसे कि X86, ARM, PowerPC आदि के लिए पोर्ट किया गया है।

हालांकि, पोर्टिंग के संदर्भ में, वास्तव में क्या आवश्यक है?

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

एक अलग आर्किटेक्चर के लिए डिवाइस ड्राइवरों को एक तरफ रखकर, नए आर्किटेक्चर में लिनक्स को पोर्ट करते समय और क्या करना होगा। क्या कंपाइलर हमारे लिए हर चीज का ध्यान नहीं रखता है?


11
क्या हम यह मान सकते हैं कि आपने आर्किटेक्चर-विशिष्ट कर्नेल स्रोतों को देखा है? git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/...
Kusalananda

जवाबों:


57

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

इसका एक विशेष उदाहरण आभासी मेमोरी है, जो अधिकांश आर्किटेक्चर (पेज टेबल की पदानुक्रम) पर समान शैली में काम करता है, लेकिन प्रत्येक आर्किटेक्चर के लिए विशिष्ट विवरण है (जैसे प्रत्येक आर्किटेक्चर में स्तरों की संख्या, और यह x86 पर भी बढ़ रहा है नए बड़े चिप्स का परिचय।) लिनक्स कर्नेल कोड इन पदानुक्रमों को ट्रेस करने के लिए मैक्रोज़ का परिचय देता है, जिन्हें आर्किटेक्चर पर कंपाइलर द्वारा समाप्त किया जा सकता है, जिसमें पृष्ठ तालिकाओं के कम स्तर होते हैं (ताकि कोड सी में लिखा हो, लेकिन वास्तुकला का विवरण लेता है। विचार।)

कई अन्य क्षेत्र प्रत्येक वास्तुकला के लिए बहुत विशिष्ट हैं और उन्हें आर्क-विशिष्ट कोड से निपटने की आवश्यकता है। हालांकि इनमें से अधिकांश असेंबली भाषा में कोड शामिल हैं। उदाहरण हैं:

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

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

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

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

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

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

कुछ वास्तव में आश्चर्य की बात है, उदाहरण के लिए आप देखेंगे कि प्रत्येक आर्किटेक्चर पर उपलब्ध सिस्टम कॉल की संख्या अलग है और कुछ सिस्टम कॉल कुछ आर्किटेक्चर में मौजूद होंगे, अन्य में नहीं। (X86 पर भी, syscalls की सूची 32-बिट और 64-बिट कर्नेल के बीच भिन्न होती है)

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


7
बहुत अच्छा लेखन! Syscalls की संख्या में भिन्नता ज्यादातर इतिहास से संबंधित है: नए बंदरगाहों में पोर्ट के समय मान्य syscalls शामिल हैं, वे पुराने बंदरगाहों में मौजूद ऐतिहासिक सामान के साथ परेशान नहीं करते हैं, इसलिए पदावनत syscalls आमतौर पर बंदरगाहों में मौजूद नहीं होते हैं। पदावनति की तुलना में नया। (जो सभी परिदृश्यों को कवर नहीं करता है ...)
स्टीफन किट

10

लिनक्स कर्नेल को पोर्ट करने के अलावा, आपको "उपयोगकर्ता स्थान" कार्यक्रमों के लिए एप्लिकेशन बाइनरी इंटरफ़ेस (एबीआई) को परिभाषित करने और उपयोगकर्ता अंतरिक्ष सॉफ्टवेयर स्टैक की सबसे निचली परतों को पोर्ट करने की आवश्यकता होगी । लिनक्स का उपयोग आमतौर पर GNU प्रोजेक्ट के निम्न-स्तरीय उपयोगकर्ता अंतरिक्ष घटकों के साथ किया जाता है, जिनमें से सबसे महत्वपूर्ण हैं:

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

सॉफ्टवेयर के कई अन्य टुकड़ों में वैकल्पिक प्लेटफ़ॉर्म-निर्भर घटक हैं; उदाहरण के लिए, यदि आप अपने नए CPU आर्किटेक्चर के लिए NSS और OpenSSL के लिए हाथ से अनुकूलित क्रिप्टोग्राफ़िक प्रिमिटिव लिखते हैं , और IonMonkey और V8 के लिए बस-इन-टाइम संकलन बैक-एंड लिखते हैं, तो वेब ब्राउज़िंग काफी तेज़ हो जाएगी । लेकिन एक नया मंच लाने के लिए ये जरूरी नहीं हैं।


1

आपको उस हार्डवेयर के बारे में कर्नेल को बताना होगा जिसे आप पोर्ट कर रहे हैं। कर्नेल का काम सीधे हार्डवेयर के साथ इंटरफेस करना है, इसलिए इसे ठीक से काम करने के लिए, कर्नेल को सीपीयू, ऑसिलेटर (घड़ियों), और किसी भी परिधीय के बारे में जानने की जरूरत है, जैसे विभिन्न प्रकार के सीरियल पोर्ट (एसपीआई, कैन,) I2C, आदि)।

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

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