ऑपरेटिंग सिस्टम को क्रैश करने से असेंबली प्रोग्राम को क्या रोकता है? [बन्द है]


18

सबसे पहले, मैं एक शुरुआती हूं, इसलिए यदि यह प्रश्न मूर्खतापूर्ण लगता है, तो कृपया गलत धारणाओं को इंगित करें।

जो मैं समझता हूं, एक ऑपरेटिंग सिस्टम का काम हार्डवेयर और ओएस पर चलने वाले सॉफ़्टवेयर का प्रबंधन करना है। इसके अलावा, जो मैं समझता हूं, विधानसभा कार्यक्रम एक को लगभग सीधे हार्डवेयर को नियंत्रित करने की अनुमति देते हैं। असेंबली प्रोग्राम में, कोई डेटा को रजिस्टरों में पढ़ और लिख सकता है, और रैम में डेटा पढ़ और लिख सकता है।

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

प्रशन:

  1. क्या उपरोक्त वर्णित तरीके से रजिस्टर ए के साथ गड़बड़ करना संभव है?

  2. यदि नहीं, तो ओएस द्वारा उपयोग किए गए रजिस्टरों को संशोधित करने से विधानसभा कार्यक्रमों को क्या रोकता है?


13
स्मार्ट प्रोग्रामर ...
टोनी स्टीवर्ट Sunnyskyguy EE75

अब बहुत सारे कंप्यूटर आर्किटेक्चर हैं और अतीत में थे, साथ ही कई ऑपरेशन सिस्टम विकसित किए गए थे। आप किस आर्किटेक्चर / ओएस का जिक्र कर रहे हैं? कुछ (पुराने) आर्किटेक्चर पर प्रोग्राम को रोकने की कोई संभावना नहीं थी कि यह शुरुआत के बाद क्या कर रहा था, यह सही है। लेकिन आधुनिक हार्डवेयर / OS ने हार्डवेयर उपकरणों में बनाया है जो "सामान्य" मोड में प्रोग्राम के लिए केवल मेमोरी का हिस्सा देते हैं (सुपरयूजर नहीं), और यह इस सीमा के बाहर मेमोरी तक नहीं पहुंच सकता है। रजिस्टरों का उपयोग करने के लिए स्वतंत्र हैं, क्योंकि ओएस रजिस्टरों में किसी भी उपयोगी जानकारी को मेमोरी में / डिस्क पर स्टोर नहीं करता है।
cyclone125

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

1
@flux मैंने अपनी टिप्पणी अपडेट कर दी है। इसका उत्तर होगा: आपके प्रश्न का कोई "सामान्य" उत्तर नहीं है, क्योंकि विभिन्न कंप्यूटर आर्किटेक्चर / ओएस थे / थे। यह अलग-अलग तरीकों से हो सकता है।
cyclone125

2
... बहुत पहले मैं कच्चे मशीन कोड में लिखता था। य हा !!! :-)
रसेल मैकमोहन

जवाबों:


33

अंत में, सभी कार्यक्रम मशीन कोड हैं, चाहे स्रोत भाषा असेंबलर या उच्च-स्तरीय भाषा हो।

महत्वपूर्ण बात यह है कि हार्डवेयर तंत्र हैं जो एक दी गई प्रक्रिया को सीमित कर सकते हैं, जिसमें "रजिस्टरों के साथ गड़बड़" शामिल है जो अन्य कार्यक्रमों या ऑपरेटिंग सिस्टम को प्रभावित कर सकता है।

यह ऑपरेशन के "उपयोगकर्ता" और "पर्यवेक्षक" मोड के बीच एक सरल अंतर के साथ शुरू हुआ, और तब से विशेषाधिकार के कई "छल्ले" के साथ एक सुरक्षा वास्तुकला में विकसित हुआ है।


यहाँ इसे थोड़ा और ठोस बनाने के लिए एक बहुत ही सामान्य उदाहरण दिया गया है:

  • "उपयोगकर्ता मोड" में, एक प्रक्रिया मेमोरी तक नहीं पहुंच सकती है जिसे इसकी प्रक्रिया आईडी को नहीं सौंपा गया है। अन्य प्रक्रियाओं को सौंपी गई मेमोरी और स्वयं ऑपरेटिंग सिस्टम अवरुद्ध है। इसमें उन अन्य प्रक्रियाओं द्वारा उपयोग किए गए रजिस्टरों के मूल्य शामिल हैं। इसे MMU हार्डवेयर द्वारा लागू किया गया है।

  • इसलिए, "उपयोगकर्ता मोड" में, एक प्रक्रिया MMU नियंत्रण रजिस्टरों तक नहीं पहुंच सकती है।

  • और जाहिर है, "उपयोगकर्ता मोड" में, एक प्रक्रिया बहुत अच्छी तरह से परिभाषित तंत्र के माध्यम से मोड को "पर्यवेक्षक मोड" में नहीं बदल सकती है जिसमें एक ऑपरेटिंग सिस्टम फ़ंक्शन को कॉल करना शामिल है।

यदि प्रक्रिया इन नियमों में से किसी को तोड़ने की कोशिश करती है तो ऑपरेटिंग सिस्टम को नियंत्रण मिलता है। एक बार ऐसा होने के बाद, ओएस केवल अपमानजनक प्रक्रिया को रोक सकता है, कभी भी इसके निर्देशों को निष्पादित नहीं कर सकता है।


2
अगर मैं सही ढंग से समझूं, तो आप क्या कह रहे हैं: कुछ प्रोसेसरों में "उपयोगकर्ता मोड" और "पर्यवेक्षक मोड" होता है। ओएस "पर्यवेक्षक मोड" में चलता है, और मेरे काल्पनिक विधानसभा कार्यक्रम को चलाने के लिए प्रोसेसर को "उपयोगकर्ता मोड" में डालता है। "उपयोगकर्ता मोड" में, रजिस्टरों और रैम पते हैं जो हार्डवेयर के जानबूझकर डिजाइन के कारण असेंबली प्रोग्राम तक पहुंच नहीं सकते हैं।
फ्लक्स

3
मूल रूप से, यह उत्तर आधुनिक "i386-like" एमएमयू और संरक्षित मोड के साथ आर्किटेक्चर का वर्णन करता है। लेकिन यह सच है कि कई पुराने (i8080, MOS 6502 आदि) के साथ-साथ आधुनिक सरल (AVR, ARM Cortex-M आदि) आर्किटेक्चर भी हैं जिनमें ये विशेषताएं नहीं हैं और यदि किसी प्रकार का OS उपयोग किया जाता है (जैसे पुराना CP / M, आधुनिक FreeRTOS, ChibiOS आदि) यह क्या कर रहा है से कुछ भी कार्यक्रम को रोक नहीं सकता है।
cyclone125

2
@Flux i386 (और ऊपर) आर्किटेक्चर सीखने के लिए विवरण प्रदान करते हैं। X86 आर्किटेक्चर में न केवल मेमोरी पते हैं, जिन्हें संरक्षित किया जा सकता है, बल्कि I / O पते भी हैं। (मेमोरी एक्सेस के लिए उपयोग किए जाने वाले विभिन्न निर्देश हैं I / O एक्सेस।) i386 + में तीन मेमोरी एड्रेस हैं। खंड / चयनकर्ता-आधारित पता एक चयनकर्ता रजिस्टर का उपयोग करता है जो एक 32-बिट रैखिक पते में जोड़े को मैप करने के लिए तालिका प्रविष्टि (GDT या LDT) का संदर्भ देता है। पेजिंग टेबल तब 32-बिट रैखिक पते को 36-बिट भौतिक पते (पी-द्वितीय) में अनुवाद करती है। दोनों अनुवाद चरणों में संरक्षण मौजूद है।
जोंक

4
@ आपका सारांश सही है। एक उपयुक्त मल्टीटास्किंग ओएस के साथ संरक्षित मेमोरी सिस्टम में एक प्रोग्राम निर्देशों की किसी भी धारा के साथ सिस्टम को क्रैश करने में सक्षम नहीं होना चाहिए। यहां तक ​​कि अमान्य भी - वे एक विशेष हैंडलर पर समाप्त होते हैं।
pjc50

भले ही वहाँ कई छल्ले हैं (x86 में कम से कम), यह बहुत है, वास्तव में दो से अधिक के लिए बहुत दुर्लभ है।
वन

10

कई मल्टीटास्किंग ऑपरेटिंग सिस्टम एक डेटा संरचना का उपयोग करते हैं जिसे a कहा जाता है रजिस्टर ओवरराइट समस्या की देखभाल के लिए प्रोसेस कंट्रोल ब्लॉक (PCB) । जब आप अपना कोड चलाते हैं, तो OS उस पर नज़र रखने के लिए एक नई प्रक्रिया बनाता है। पीसीबी में आपकी सामग्री और रजिस्टर सामग्री रखने के लिए आवंटित स्थान के बारे में जानकारी है। मान लीजिए कि प्रक्रिया A वर्तमान में प्रोसेसर पर चल रही है और आपका कोड B. में है। जब आप अपना कोड चलाते हैं तो कुछ होता है।

  1. प्रक्रिया ए के राज्य डेटा (रजिस्टर सामग्री, प्रोग्राम काउंटर, आदि) को उसके पीसीबी में कॉपी किया जाता है।

  2. प्रोसेस बी के स्टेट डेटा को उसके पीसीबी से सीपीयू रजिस्टर में कॉपी किया जाता है

  3. प्रोसेस बी प्रोसेसर पर तब तक चलता है जब तक कि यह खत्म या पूर्व-निर्धारित न हो

  4. प्रोसेस बी के स्टेट डेटा को वापस उसके पीसीबी में कॉपी किया जाता है

  5. प्रक्रिया ए के राज्य डेटा को वापस सीपीयू में कॉपी किया जाता है और यह जारी रहता है

यदि ऑपरेटिंग सिस्टम प्रक्रिया ए के रूप में चल रहा है, तो आप देख सकते हैं कि आपके प्रोग्राम को चलाने से पहले उसके रजिस्टरों को कैसे सहेजा जाए, फिर उन्हें सीपीयू में कॉपी करना एक बार जब आपका प्रोग्राम समाप्त हो जाता है तो उपयोगकर्ता प्रोग्राम को अन्य प्रक्रियाओं में क्या हो रहा है के साथ खिलवाड़ करने से रोकता है।

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

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


4

इस बात पर निर्भर करता है कि आप किस प्लेटफार्म पर बात कर रहे हैं।

  • एक अधिक बुनियादी प्रोसेसर पर, प्रोसेसर सिर्फ वही निष्पादित करता है जो कार्यक्रम को निर्देश देता है।

  • अधिक परिष्कृत प्रोसेसर पर, कम से कम दो मोड हैं। एक मोड में, प्रोसेसर वह करता है जो प्रोग्राम उसे करने के लिए कहता है। दूसरे मोड में, प्रोसेसर स्वयं कुछ निर्देशों को निष्पादित करने से इनकार करता है।

पूरे सिस्टम को क्रैश करने वाले प्रोग्राम को क्या रोकता है? पहले प्रकार के प्रोसेसर के साथ, उत्तर "कुछ भी नहीं" है। एक बुनियादी प्रोसेसर के साथ, एक एकल दुष्ट प्रोग्राम वास्तव में पूरे सिस्टम को क्रैश कर सकता है। सभी शुरुआती 8-बिट होम कंप्यूटर, और 16-बिट वाले कई, इस श्रेणी में आते हैं।

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

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

  1. एक प्रोसेसर जिसमें वास्तव में सुरक्षा हार्डवेयर होता है (यानी, इसे कुछ निर्देशों को निष्पादित करने से इनकार करने के लिए कॉन्फ़िगर किया जा सकता है)।

  2. एक ओएस जो वास्तव में खुद को बचाने के लिए इन सुविधाओं का उपयोग करता है। (यह सुरक्षा सर्किटरी के साथ एक चिप होने से अच्छा नहीं है यदि ओएस इसका उपयोग नहीं करता है!)

बस किसी भी आधुनिक डेस्कटॉप ओएस के बारे में आप (विंडोज, लिनक्स, मैक ओएस, बीएसडी ...) नाम रख सकते हैं। यह एक संरक्षित मोड वाला ओएस है जो प्रोटेक्शन हार्डवेयर के साथ प्रोसेसर पर चलता है। यदि आप कुछ 8-बिट माइक्रोकंट्रोलर पर एम्बेडेड विकास कर रहे हैं, तो संभवतः कोई सुरक्षा हार्डवेयर नहीं है। (या किसी भी ओएस, उस मामले के लिए ...)


1

प्र। ऑपरेटिंग सिस्टम को क्रैश करने से असेंबली प्रोग्राम को क्या रोकता है?

A. कुछ नहीं।

हालांकि, बहुत अधिक चतुर प्रोग्रामर ने इसे और अधिक कठिन बनाने के लिए वर्षों में बहुत कोशिश की है। दुर्भाग्य से, हर चतुर प्रोग्रामर के लिए, कई, कई अन्य लोग हैं जो उनके बीच अधिक रचनात्मक, अधिक महत्वाकांक्षी हैं, और कभी-कभी सिर्फ भाग्यशाली और फिर चतुर व्यक्ति हैं। हर बार एक चतुर प्रोग्रामर कहता है कि किसी को कुछ करना चाहिए या नहीं करना चाहिए, कोई व्यक्ति इसे करने का एक तरीका खोज लेगा। Microsoft Windows (एक उदाहरण के रूप में) लगभग 35 वर्षों से है और हमारे पास अभी भी BSoD (ब्लू स्क्रीन ऑफ डेथ) है, जो सिर्फ निर्देश हैं जो ऑपरेटिंग सिस्टम को क्रैश कर गए हैं।

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

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

  with open("myFile.txt", "w+") as f:
      # do some really clever things
      f.write("Goodbye cruel world!")

आइए सभी विवरणों को अनदेखा करें कि भौतिक अवस्थाओं तक कैसे पहुँचा और बदला जाता है या कैसे उन्हें बिट्स और बाइट्स के रूप में व्याख्या की जाती है या कैसे उन बाइट्स को मेमोरी और सीपीयू से स्थानांतरित किया जाता है, और भरोसा है कि ओएस द्वारा प्रदान किए जाने वाले कार्यक्रमों द्वारा सभी को नियंत्रित किया जाता है। परदे के पीछे। आप केवल इस बारे में सोचते हैं कि आप किसी फ़ाइल के अंत में कैसे जुड़ते हैं। 1) पता लगाएँ कि फ़ाइल का अंत कहाँ है, 2) उस स्थिति में कुछ लिखें। क्या गलत होने की सम्भावना है? दरअसल, काफी कुछ। जब आप चतुर चीजें कर रहे हों तो कंप्यूटर पर क्या हो रहा है, इसके बारे में सोचें। अगर किसी और के द्वारा किया जा रहा कुछ भी (ऑपरेटिंग सिस्टम सहित) आप किसी भी तरह से काम कर रहे फ़ाइल को बदल देते हैं, तो यह वास्तव में सरल नौकरी अचानक पूरी तरह से अधिक जटिल हो जाती है। फ़ाइल लंबी है, फ़ाइल छोटी है। फ़ाइल अब वहाँ नहीं है। डिस्क भरा हुआ है,

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