आप इस बात का उल्लेख करते हैं कि यदि कोड सीपीयू के लिए विशिष्ट है, तो यह ओएस के लिए भी विशिष्ट क्यों होना चाहिए। यह वास्तव में एक दिलचस्प सवाल है जो यहां के कई उत्तरों ने ग्रहण किया है।
सीपीयू सुरक्षा मॉडल
सबसे सीपीयू आर्किटेक्चर पर चलने वाला पहला प्रोग्राम इनर रिंग या रिंग 0 के अंदर चलता है । एक विशिष्ट सीपीयू आर्क इम्प्लीमेंट रिंग कैसे बदलता है, लेकिन यह खड़ा है कि लगभग हर आधुनिक सीपीयू में ऑपरेशन के कम से कम 2 मोड हैं, एक जो विशेषाधिकार प्राप्त है और 'नंगे मेटल' कोड चलाता है जो सीपीयू प्रदर्शन कर सकता है और कोई भी कानूनी कार्रवाई कर सकता है। अविश्वसनीय और संरक्षित कोड चलाता है जो केवल क्षमताओं के एक निर्धारित सुरक्षित सेट को निष्पादित कर सकता है। हालांकि कुछ सीपीयू में ग्रैन्युलैरिटी अधिक होती है और वीएम को सुरक्षित रूप से उपयोग करने के लिए कम से कम 1 या 2 अतिरिक्त रिंग्स की आवश्यकता होती है (अक्सर इसे नकारात्मक संख्याओं के साथ लेबल किया जाता है) हालांकि यह इस उत्तर के दायरे से परे है।
जहां OS आता है
अर्ली सिंगल टास्किंग ओएस
बहुत प्रारंभिक DOS और अन्य प्रारंभिक एकल टास्किंग आधारित प्रणालियों में सभी कोड आंतरिक रिंग में चलाए जाते थे, हर प्रोग्राम जिसे आपने कभी भी चलाया था, पूरे कंप्यूटर पर पूरी शक्ति रखता था और शाब्दिक रूप से कुछ भी कर सकता था यदि यह आपके सभी डेटा या यहां तक कि हार्डवेयर क्षति को हटाने सहित दुर्व्यवहार करता है कुछ चरम मामलों में, जैसे कि बहुत पुराने डिस्प्ले स्क्रीन पर अमान्य डिस्प्ले मोड सेट करना, बदतर, यह बिना किसी द्वेष के बस छोटी गाड़ी कोड के कारण हो सकता है।
यह कोड वास्तव में काफी हद तक OS अज्ञेयवादी था, जब तक कि आपके पास लोडर था जो प्रोग्राम को मेमोरी में लोड करने में सक्षम था (शुरुआती बाइनरी प्रारूपों के लिए बहुत सरल) और कोड किसी भी ड्राइवर पर भरोसा नहीं करता था, सभी हार्डवेयर एक्सेस को लागू करने के तहत इसे चलाना चाहिए कोई भी OS जब तक वह रिंग 0. में चलाया जाता है, तो नोट, इस तरह का एक बहुत ही सरल ओएस आमतौर पर एक मॉनिटर कहलाता है यदि इसका उपयोग केवल अन्य प्रोग्राम चलाने के लिए किया जाता है और कोई अतिरिक्त कार्यक्षमता प्रदान नहीं करता है।
आधुनिक मल्टी टास्किंग ओएस
UNIX सहित अधिक आधुनिक ऑपरेटिंग सिस्टम , NT के साथ शुरू होने वाले विंडोज के संस्करण और अन्य विभिन्न अब अस्पष्ट OSes ने इस स्थिति में सुधार करने का निर्णय लिया, उपयोगकर्ता मल्टीटास्किंग जैसी अतिरिक्त सुविधाएँ चाहते थे ताकि वे एक बार में एक से अधिक एप्लिकेशन चला सकें और सुरक्षा हो, इसलिए बग ( या दुर्भावनापूर्ण कोड) किसी एप्लिकेशन में अब मशीन और डेटा को असीमित नुकसान नहीं पहुंचा सकता है।
यह ऊपर उल्लिखित रिंगों का उपयोग करके किया गया था, ओएस रिंग 0 में चलने वाली एकमात्र जगह लेगा और अनुप्रयोग बाहरी अविश्वसनीय रिंगों में चलेगा, केवल संचालन के एक सीमित सेट को निष्पादित करने में सक्षम होगा जिसे ओएस ने अनुमति दी थी।
हालाँकि, यह बढ़ी हुई उपयोगिता और सुरक्षा एक लागत पर आई, अब प्रोग्रामों को ओएस के साथ काम करना पड़ता था ताकि वे स्वयं को करने की अनुमति न देने वाले कार्यों को कर सकें, वे अब उदाहरण के लिए हार्ड डिस्क पर सीधे नियंत्रण नहीं रख सकते हैं, इसकी स्मृति तक पहुंच और मनमाना परिवर्तन कर सकते हैं डेटा, इसके बजाय उन्हें ओएस को उनके लिए इन कार्यों को करने के लिए कहना था ताकि यह जांच सके कि उन्हें ऑपरेशन करने की अनुमति दी गई थी, उन फ़ाइलों को बदलना नहीं जो उनके पास नहीं थीं, यह भी जांच करेगा कि ऑपरेशन वास्तव में वैध था। हार्डवेयर को अपरिभाषित स्थिति में नहीं छोड़ेगा।
प्रत्येक OS ने इन सुरक्षा के लिए एक अलग कार्यान्वयन का फैसला किया, आंशिक रूप से वास्तुकला के आधार पर ओएस को डिजाइन किया गया था और आंशिक रूप से ओएस के डिजाइन और सिद्धांतों के आधार पर प्रश्न में, UNIX उदाहरण के लिए बहु उपयोगकर्ता उपयोग और केंद्रित होने वाली मशीनों पर ध्यान केंद्रित किया। एक उपयोगकर्ता के साथ धीमे हार्डवेयर पर चलने के लिए, विंडोज़ के लिए उपलब्ध सुविधाओं को सरल बनाने के लिए डिज़ाइन किया गया था। जिस तरह से उपयोगकर्ता-स्पेस प्रोग्राम भी ओएस पर बात करते हैं, वह X86 पर पूरी तरह से अलग है क्योंकि यह ARM या MIPS पर होगा, उदाहरण के लिए हार्डवेयर पर काम करने की आवश्यकता के आधार पर निर्णय लेने के लिए एक मल्टी-प्लेटफ़ॉर्म OS को मजबूर करना।
इन ओएस विशिष्ट इंटरैक्शन को आमतौर पर "सिस्टम कॉल" कहा जाता है और इसमें शामिल होता है कि कैसे एक यूजर स्पेस प्रोग्राम पूरी तरह से ओएस के माध्यम से हार्डवेयर के साथ इंटरैक्ट करता है, वे मूल रूप से ओएस के फ़ंक्शन के आधार पर भिन्न होते हैं और इस प्रकार एक प्रोग्राम जो सिस्टम कॉल के माध्यम से अपना काम करता है, को उसकी जरूरत होती है ओएस विशिष्ट हो।
कार्यक्रम लोडर
सिस्टम कॉल के अलावा, प्रत्येक OS एक प्रोग्राम को द्वितीयक भंडारण माध्यम से और मेमोरी में लोड करने के लिए एक अलग विधि प्रदान करता है , एक विशिष्ट ओएस द्वारा लोड करने योग्य होने के लिए प्रोग्राम में एक विशेष हेडर होना चाहिए जिसमें ओएस का वर्णन हो कि यह कैसे हो सकता है। लोड किया गया और चला।
यह हेडर काफी सरल हुआ करता था कि एक अलग प्रारूप के लिए लोडर लिखना लगभग तुच्छ था, हालांकि एल्फ जैसे आधुनिक प्रारूपों के साथ जो कि गतिशील लिंकिंग और कमजोर घोषणाओं जैसी उन्नत सुविधाओं का समर्थन करता है, जो अब बायनेरिज़ को लोड करने के प्रयास के लिए ओएस के लिए असंभव के पास है। जो इसके लिए डिज़ाइन नहीं किए गए थे, इसका मतलब है, भले ही सिस्टम कॉल असंगतताएं नहीं थीं, यह एक तरह से रैम में एक कार्यक्रम को जगह देना भी काफी कठिन है जिसमें इसे चलाया जा सकता है।
पुस्तकालय
प्रोग्राम शायद ही कभी सिस्टम कॉल का सीधे उपयोग करते हैं, हालांकि, वे लगभग विशेष रूप से अपनी कार्यक्षमता प्राप्त करते हैं, हालांकि लाइब्रेरी जो सिस्टम कॉलिंग को प्रोग्रामिंग भाषा के लिए थोड़े मैत्रीपूर्ण प्रारूप में लपेटते हैं, उदाहरण के लिए, सी में सी मानक लाइब्रेरी है और लिनक्स के तहत glibc और इसी तरह और win32 lib के तहत विंडोज एनटी और इसके बाद के संस्करण, अधिकांश अन्य प्रोग्रामिंग भाषाओं में भी समान पुस्तकालय हैं जो एक उपयुक्त तरीके से सिस्टम कार्यक्षमता को लपेटते हैं।
ये लाइब्रेरी कुछ हद तक ऊपर बताए गए क्रॉस प्लेटफॉर्म के मुद्दों को भी दूर कर सकती हैं, पुस्तकालयों की एक श्रृंखला है जो अनुप्रयोगों के लिए एक समान मंच प्रदान करने के लिए डिज़ाइन की गई हैं, जबकि आंतरिक रूप से एसडीएल जैसे ओएस की एक विस्तृत श्रृंखला के लिए कॉल का प्रबंधन करते हैं , इसका मतलब यह है कि हालांकि प्रोग्राम बाइनरी संगत नहीं हो सकते हैं, जो प्रोग्राम इन पुस्तकालयों का उपयोग करते हैं वे प्लेटफार्मों के बीच आम स्रोत हो सकते हैं, जिससे पोर्टिंग को सरल बनाने के साथ-साथ पुन: उपयोग में लाया जा सकता है।
इसके बाद के संस्करण के अपवाद
यहां तक कि सभी के बावजूद, मैंने कहा है कि एक से अधिक ऑपरेटिंग सिस्टम पर प्रोग्राम चलाने में सक्षम नहीं होने की सीमाओं को दूर करने का प्रयास किया गया है। कुछ अच्छे उदाहरण वाइन प्रोजेक्ट हैं, जिन्होंने सफलतापूर्वक विंड ३२ प्रोग्राम को विभिन्न यूनिक्स पर चलाने के लिए विंड ३२ प्रोग्राम लोडर, बाइनरी फॉर्मेट और सिस्टम लाइब्रेरी दोनों का अनुकरण किया है। लिनक्स सॉफ्टवेयर चलाने के लिए कई BSD UNIX ऑपरेटिंग सिस्टम को अनुमति देने वाली एक संगतता परत भी है और निश्चित रूप से Apple के अपने शिम को MacOS X के तहत पुराने MacOS सॉफ़्टवेयर को चलाने की अनुमति देता है।
हालाँकि ये परियोजनाएँ मैन्युअल विकास प्रयास के विशाल स्तरों के माध्यम से काम करती हैं। इस बात पर निर्भर करता है कि दोनों ओएस अलग-अलग हैं, कठिनाई एक छोटे से छोटे शिम से दूसरे ओएस के पूर्ण अनुकरण के करीब है जो अक्सर अपने आप में एक संपूर्ण ऑपरेटिंग सिस्टम लिखने की तुलना में अधिक जटिल होती है और इसलिए यह अपवाद है और नियम नहीं।