कर्नेल एक दुर्भावनापूर्ण प्रोग्राम को सभी भौतिक रैम को पढ़ने से कैसे रोकता है?


10

यदि मैं एक प्रोग्राम लिखता हूं जो हर संभव पते पर मेमोरी पढ़ने की कोशिश करता है, और मैं इसे "पूर्ण" यूनिक्स पर चलाता हूं, तो यह सभी भौतिक रैम तक नहीं पहुंच पाएगा। लेकिन ऑपरेटिंग सिस्टम इसे कैसे करने से रोकता है?

मैं छोटे सीपीयू आर्किटेक्चर से अधिक परिचित हूं जहां विधानसभा कोड का कोई भी टुकड़ा सब कुछ एक्सेस कर सकता है। मुझे समझ नहीं आता है कि कोई प्रोग्राम (कर्नेल) ऐसे दुर्भावनापूर्ण संचालन का पता कैसे लगा सकता है।


2
आमतौर पर MMU इस बात का ध्यान रखता है कि आप अपने अनुमत क्षेत्रों के बाहर मेमोरी एक्सेस नहीं कर सकते।
ott-- 20

1
खैर, MMU विधानसभा द्वारा कॉन्फ़िगर किया गया है। इस प्रकार एक विधानसभा कोड MMU कॉन्फ़िगरेशन को बदल सकता है और एक अलग मेमोरी पेज तक पहुंच सकता है, है ना?
नोक्स

यह केवल तभी सही है जब आप अपना कोड रूट के रूप में चलाते हैं।
ott--

2
आपको वहां पेज-टेबल और कर्नेल एब्स्ट्रक्शन के बारे में पढ़ना चाहिए।
क्लारस

@ott: यहां तक ​​कि रूट MMU (कम से कम लिनक्स पर नहीं) को संशोधित नहीं कर सकता है। केवल कर्नेल करता है।
बेसिल स्टारीनेविच

जवाबों:


12

यह खराब मेमोरी एक्सेस को रोकने वाला कर्नेल नहीं है, यह सीपीयू है। कर्नेल की भूमिका केवल सीपीयू को सही ढंग से कॉन्फ़िगर करने के लिए है।

अधिक सटीक रूप से, खराब मेमोरी एक्सेस को रोकने वाला हार्डवेयर घटक MMU है । जब कोई प्रोग्राम मेमोरी एड्रेस को एक्सेस करता है, तो सीपीयू द्वारा एमएमयू की सामग्री के आधार पर एड्रेस को डिकोड किया जाता है। MMU वर्चुअल एड्रेस से फिजिकल एड्रेस तक ट्रांसलेशन स्थापित करता है: जब CPU एक निश्चित वर्चुअल एड्रेस पर लोड या स्टोर करता है, तो वह MMU कंटेंट के आधार पर संबंधित फिजिकल एड्रेस की गणना करता है। कर्नेल MMU कॉन्फ़िगरेशन को इस तरह सेट करता है कि प्रत्येक प्रोग्राम केवल उस मेमोरी तक पहुँच सकता है जिसके वह हकदार है। अन्य प्रोग्रामों की मेमोरी और हार्डवेयर रजिस्टरों को प्रोग्राम की मेमोरी में बिल्कुल भी मैप नहीं किया जाता है: इन भौतिक पतों का उस प्रोग्राम के लिए MMU कॉन्फ़िगरेशन में कोई संगत वर्चुअल पता नहीं होता है।

विभिन्न प्रक्रियाओं के बीच एक संदर्भ स्विच पर, कर्नेल MMU कॉन्फ़िगरेशन को संशोधित करता है ताकि इसमें नई प्रक्रिया के लिए वांछित अनुवाद शामिल हो।

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


क्या आप थोड़ा सा विवरण "एमएमयू की सामग्री के आधार पर सीपीयू द्वारा डिकोड किया गया है" निर्दिष्ट कर सकते हैं ? क्या चल रहे कार्यक्रम में एक वास्तविक कोड है जो पते को डीकोड करता है? या जब कोई सीपीयू किसी पते तक पहुंच बनाता है - तो पहुंच एमएमयू से की जाती है, जो इसे ठीक से अनुवाद / हैंडल करता है (मेमोरी या कैश तक पहुंच बनाता है और परिणाम लौटाता है, या कर्नेल प्रक्रिया को ट्रिगर करता है)? इसलिए, माइक्रोकंट्रोलर / असेंबली के नजरिए से, MMU नया हिस्सा है। CPU सीधे मेमोरी से कनेक्ट नहीं होता है, यह MMU से जुड़ा होता है और यहीं से वर्चुअल मेमोरी एब्स्ट्रेक्शन होता है।
xealits

3
@xealits वर्चुअल पते से भौतिक पते तक का अनुवाद MMU के अंदर किया जाता है, जो एक हार्डवेयर सर्किट है। प्रोग्राम में या कर्नेल में ऐसा करने के लिए कोई कोड नहीं है। कर्नेल केवल असाधारण मामलों में लगाया जाता है, जब प्रोग्राम वर्चुअल पते पर पहुंचने का प्रयास करता है जिसके लिए MMU प्रविष्टि "अमान्य पता" कहती है। एमएमयू द्वारा उपयोग किए जाने वाले रैम में रजिस्टरों और तालिकाओं को कॉन्फ़िगर करने का काम कर्नेल भी करता है।
गिल्स एसओ- बुराई को रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.