2010-10-19 3 views
5

सी में वास्तव में लिखे गए ओएस (डिवाइस इंटरैक्शन लेवल) के कोर हैं, या "सी में लिखे गए" का अर्थ है कि ओएस का केवल अधिकांश हिस्सा सी में लिखा गया है और उपकरणों के साथ बातचीत लिखी गई है एएसएम में?सीएस में पूरी तरह से लिखा ओएस के कोर (डिवाइस abstraction स्तर) हैं? (जैसे: "यूनिक्स सी में लिखा गया है")

मैं क्यों चाहते हैं कि:

  1. कोर एएसएम में लिखा है - यह पार मंच नहीं हो सकता।
  2. तो यह लिखा है सी है - मैं कल्पना नहीं कर सकते कि यह कैसे सी
  3. में

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

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

+1

क्या आप # 3 द्वारा मतलब है? –

+2

अधिकांश ओएस प्रक्रिया शेड्यूलिंग, मेमोरी मैनेजमेंट, फाइल सिस्टम इंटरैक्शन कोर के रूप में अधिक उच्च स्तरीय सामान मानते हैं, डिवाइस इंटरैक्शन – nos

उत्तर

3

यह निर्भर करता है।

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

डिवाइस ड्राइवर, लगभग हमेशा, सी में पूरी तरह से लिखा जा सकता है

+0

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

+1

@MInner: नहीं क्योंकि CPU डेवलपर्स ने विशेष पुस्तकालय प्रदान किए हैं, लेकिन क्योंकि संकलक डिवाइस (या संचार बस से कनेक्ट होने वाली संचार बस) तक पहुंचने के लिए सही कोड उत्पन्न कर सकता है –

+0

इस प्लेटफ़ॉर्म के लिए या किसी के लिए शिकायतकर्ता? यदि किसी के लिए ... संकलक से वास्तव में भारी या मुझे मॉड्यूटेड होना चाहिए। –

3

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

थोड़ा कार्यान्वयन-विशिष्ट चालबाजी द्वारा, ड्राइवरों को सी में पूरी तरह से लिखना संभव हो सकता है, क्योंकि यह सामान्य रूप से बनाना संभव है, volatile int * जो मेमोरी-मैप किए गए डिवाइस रजिस्टर का उपयोग करेगा।

9

यूनिक्स में मूल विचार का यह C था 99% की तरह सी में लगभग सब कुछ तो मूल रूप से कुछ लिखने के लिए, है, यह बात यह थी , और मुख्य लक्ष्य पोर्टेबिलिटी थी।
तो अपने प्रश्न का उत्तर देने के लिए, उपकरणों के साथ बातचीत सी, हाँ में भी लिखी गई है। सी में भी बहुत कम स्तर की चीजें लिखी गई हैं, खासकर यूनिक्स में। लेकिन असेंबली भाषा में अभी भी बहुत कम हिस्से लिखे गए हैं। उदाहरण के लिए x86 पर, किसी भी ओएस के बूट लोडर में असेंबलर में कुछ हिस्सा शामिल होगा। आपके पास असेंबली भाषा में लिखे गए डिवाइस ड्राइवरों के छोटे हिस्से हो सकते हैं। लेकिन यह असामान्य है, और जब भी यह किया जाता है यह आमतौर पर निम्नतम स्तर के कोड का एक बहुत ही छोटा हिस्सा है। कार्यान्वयन पर वास्तव में कितना निर्भर करता है। उदाहरण के लिए, नेटबीएसडी विभिन्न दर्जनों आर्किटेक्चर पर चल सकता है, इसलिए वे हर कीमत पर असेंबली भाषा से बचते हैं; इसके विपरीत, ऐप्पल पोर्टेबिलिटी की परवाह नहीं करता है इसलिए मैकोज़ libc का एक सभ्य हिस्सा असेंबली भाषा में लिखा गया है।

+1

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

+0

में लिखा गया है, ऐप्पल पोर्टेबिलिटी की परवाह करता है। इसकी वर्तमान ऑपरेटिंग सिस्टम i386, x86_64 और एआरएम पर चलनी है। पिछले पुनरावृत्ति (ओएस एक्स 10.5) भी पावरपीसी वास्तुकला पर भाग गया। मुझे संदेह है कि सिंकल इंटरफ़ेस को छोड़कर इसके किसी भी libc को असेंबलर में लिखा गया है। – JeremyP

+0

हां, हाँ वे करते हैं, लेकिन मेरा मतलब व्यापक स्ट्रोक में था। वे अपने किसी भी प्रत्यक्ष सहमति से कहीं कम हार्डवेयर कॉन्फ़िगरेशन का समर्थन करते हैं, और इस अर्थ में, उनके पास बहुत कम पोर्टेबिलिटी चिंताएं हैं। Libc के बारे में, मैंने स्रोत नहीं देखा है; मैंने स्ट्रैम्प की तरह सामान पढ़ा असेंबलर में लिखा था। – Jean

3

कुछ ऑपरेटिंग सिस्टम विधानसभा भाषा में बनाई गई है, लेकिन यह है पोर्टलबिलिटी के लिए सी जैसे उच्च स्तर की भाषा में कर्नेल को लिखा जाना बहुत आम है। आम तौर पर (although this is not always the case), एक उच्च स्तरीय भाषा में लिखे गए कर्नेल में उन चीज़ों के लिए असेंबली भाषा के कुछ छोटे बिट भी होंगे जो संकलक व्यक्त नहीं कर सकते हैं और कुछ कारणों से असेंबलर में लिखे जाने की आवश्यकता है। विशिष्ट उदाहरण हैं:

  • कुछ कर्नेल-मोड केवल निर्देश MMU में हेरफेर या प्रदर्शन अन्य विशेषाधिकार प्राप्त संचालन एक मानक संकलक द्वारा उत्पन्न नहीं किया जा सकता है। इस मामले में कोड असेंबली भाषा में लिखा जाना चाहिए।

  • प्लेटफ़ॉर्म-विशिष्ट प्रदर्शन अनुकूलन। उदाहरण के लिए एक्स 64 आर्किटेक्चर में एंडन-नेस स्वैपिंग निर्देश है और एआरएम में बैरल शिफ्ट होता है (एन बिट्स द्वारा पढ़ा जाने वाला शब्द घुमाता है) जिसे लोड ऑपरेशंस पर इस्तेमाल किया जा सकता है।

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

1

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

+0

लेकिन यह सभी प्रोग्रामिंग तथ्यों को सरल, जटिल और जटिल रूप से दस्तावेज करने के लिए SO का बिंदु है। –

1

यदि आप विशिष्ट पॉइंटर्स में रुचि रखते हैं, तो लिनक्स कर्नेल पर विचार करें।

http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=arch/x86/kernel/entry_64.S;h=17be5ec7cbbad332973b6b46a79cdb3db2832f74;hb=HEAD

इसके अतिरिक्त, प्रत्येक वास्तुकला, कार्यक्षमता और अनुकूलन के लिए: पूरे सॉफ्टवेयर पेड़ लगभग सभी सी में लिखा है कर्नेल में इस्तेमाल विधानसभा के सबसे जाने-माने भाग entry.S कि प्रत्येक वास्तुकला के लिए विशिष्ट है है कि सी (जैसे spinlocks, परमाणु संचालन) विधानसभा में लागू किया जा सकता में संभव नहीं हैं:

http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=arch/x86/include/asm/spinlock.h;h=3089f70c0c52059e569c8745d1dcca089daee8af;hb=HEAD