कुछ ऑपरेटिंग सिस्टम ईवेंट हैंडलिंग क्यों c के बजाय asm में लिखे गए हैं?


17

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


5
"ज्यादातर सी में" - और अनुमान लगाओ कि बाकी क्या है? ;)
गोल्डीलॉक्स

@goldilocks अच्छी तरह से यह विधानसभा में है। लेकिन क्यों, जबकि अन्य भाग सी में हैं?
MAKZ

4
मैं इस पर कोई विशेषज्ञ नहीं हूं, लेकिन कुछ निम्न स्तर की हार्डवेयर संबंधित चीजें हैं जो सी में नहीं की जा सकती हैं; ये आमतौर पर विशिष्ट वास्तुकला हैं। "इनलाइन ASM" का उपयोग अक्सर उस उद्देश्य के लिए C कोड में किया जाता है, इसलिए उदाहरण के लिए foobar(), इनलाइन असेंबली का उपयोग करते हुए, एक मंच पर एक रास्ता और कुछ अन्य पर एक और तरीका परिभाषित किया जाएगा। यह asm के उपयोग को न्यूनतम रखता है, लेकिन इसे पूरी तरह से टाला नहीं जा सकता है।
गोल्डीलॉक्स

आप C में Global Descriptor Table Pointer register कैसे सेट करते हैं?
user253751

जवाबों:


24

सीपीयू रजिस्टर, और एक ओएस के लिए भाषा का सार दूर हो जाता है जब घटनाओं को संभालना पड़ता है संदर्भ को बचाने के लिए, इसलिए इसे घटना के बिंदु पर रजिस्टरों तक पहुंच की आवश्यकता होती है, इस प्रकार सी कल्पना को तोड़ता है।


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

18

C मशीन कोड से अमूर्त है जो मशीन पर चलता है (हालांकि अधिकांश अन्य भाषाओं की तुलना में बहुत करीब है)।

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

कर्नेल स्रोत कोड ट्री में इसे नीचे संग्रहीत किया जाता है arch/<arch>और include/asm-<arch>जहां <arch>एक विशिष्ट वास्तुकला नाम होता है। यह वास्तव में पूर्ण कर्नेल स्रोत का केवल एक छोटा सा हिस्सा है।


6

आप इसे C में नहीं कर सकते :)

lgdt[xxxx]
mov eax, cr0
or al, 0x01
mov cr0, eax

X86 संरक्षित मोड में आने की कोशिश कर रहा हूँ। जाहिर है कि मैं अभी भी कच्चे मशीन कोड को "एमिटिंग" करके सी में कर सकता हूं, लेकिन फिर भी अगर मुझे सटीक ऑफसेट एक्सेस करने की आवश्यकता होती है - मैं ज्यादातर भाग्य से बाहर हूं।

दूसरा उदाहरण BootLoader है। X86 सिस्टम पर, यह आवश्यक है कि पारंपरिक बूट कोड बिल्कुल 512 बाइट्स लंबा हो और अंतिम दो बाइट्स क्रमशः 0xAA और 0x55 (या 55 एए बिल्कुल) हों ... सी कंपाइलर्स के साथ ऐसी बात सुनिश्चित करना एक बुरा सपना है और कोडांतरक करता है शानदार तरीके से नौकरी।

ऐसे कई और मामले हैं जहां विधानसभा सिर्फ बेहतर नहीं है - बल्कि एकमात्र साधन है।


-5

एएसएम स्लिमर है और आम तौर पर लाइब्रेरियों आदि के साथ सी जंक की तुलना में बहुत तेज है, और ओएस हर समय बहुत सारी घटनाओं को संभाल रहा है। आप इस फंक्शन के लिए स्लिम और फास्ट चाहते हैं।


2
C कंपाइलर तकनीक का अनुकूलन बहुत अच्छा हो गया है। यह एक मिथक है कि asm आम तौर पर C. की तुलना में बहुत तेज होगा। किसी भी मामले में यह कारण नहीं है कि निम्न-स्तरीय ऑपरेटिंग सिस्टम ऑपरेशन asm का उपयोग करते हैं। इसे ज्यादातर उन ऑपरेशनों के साथ करना होता है जो मेमोरी बैरियर की तरह सी में व्यक्त नहीं किए जा सकते हैं, और नॉन-सी कॉलिंग कन्वेंशन, आदि के लिए नृत्य रजिस्टर करें ...
सेलाडा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.