कैसे ओएस मेमोरी एक्सेस उल्लंघन का पता लगाता है


12

एक ऑपरेटिंग सिस्टम (अधिमानतः लिनक्स) को कैसे पता चलता है कि आपने कोई स्मृति स्थान एक्सेस किया है जिसे आपको अनुमति नहीं है?

यह सवाल उन लानत संकेत से प्रेरित था! जिस तरह से मैं इसे देखता हूं वह यह है: कंप्यूटर में सब कुछ गति, सुरक्षा, अखंडता और इस तरह की चीजों के बीच एक समझौता है।

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

मुझे आश्चर्य हुआ कि यह प्रश्न कहीं भी अनुत्तरित प्रतीत होता है। यह कुछ ऐसा है जिसे मैंने हमेशा सोचा है। यह मुझे लगता है कि हार्डवेयर का एक भाग है जो ओएस की ओर से, अमूर्त के एक अच्छे, सुविधाजनक स्तर में करेगा। लेकिन फिर भी, इसे संभवतः हर संदर्भ स्विच पर अगली प्रक्रियाओं मेमोरी मैप्स को लोड करने की आवश्यकता होगी, जो फिर से धीमा लगता है।

तो हाँ, वैसे भी, मैं थोड़ा चल रहा हूँ: कैसे एक ओएस एक मेमोरी उल्लंघन का पता लगाता है?

धन्यवाद

जवाबों:


11

(निम्नलिखित उत्तर एक "आधुनिक" डेस्कटॉप, सर्वर, या ऊपरी-अंत एम्बेडेड प्लेटफ़ॉर्म (जैसे स्मार्टफ़ोन, और साथ ही अधिक से अधिक छोटे सिस्टम) मानता है। x86 सिस्टम के लिए, आधुनिक का मतलब 386 और ऊपर है। निम्न उत्तर भी मानता है। "आधुनिक" OS, जैसे कि लगभग कोई भी यूनिक्स, या विंडोज 95 के बाद से।)

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

एक सामान्य MMU में, जब एक पॉइंटर को डिफाइन किया जाता है, MMU बिट्स को दो समूहों में तोड़ता है: हाई-ऑर्डर बिट्स पेज नंबर बनाते हैं , और लो-ऑर्डर बिट्स पेज के अंदर एड्रेस बनाते हैं। अधिकांश डेस्कटॉप और सर्वर मशीनें 4kB पृष्ठों का उपयोग करती हैं। MMU TLB नामक तालिका में वर्चुअल पेज नंबर को देखता है (यह "मेमोरी मेमोरी मैप्स" कहा जाता है)। TLB उस भौतिक पृष्ठ की संख्या को इंगित करता है जो इस आभासी पृष्ठ से मेल खाता है। MMU तब मेमोरी में भौतिक पृष्ठ से डेटा प्राप्त करता है।

यदि TLB में इस विशेष वर्चुअल पेज नंबर के लिए कोई प्रविष्टि नहीं है, तो MMU उस प्रोसेसर को सूचित करता है जो एक अमान्य एक्सेस हुआ; इसे आमतौर पर अपवाद कहा जाता है।

ध्यान दें कि मैंने अभी तक OS का उल्लेख नहीं किया है। ऐसा इसलिए है क्योंकि यह सभी ऑपरेशन ओएस से स्वतंत्र है। ओएस खेलने में आता है क्योंकि यह दो तरह से चीजों को कॉन्फ़िगर करता है:

  • ओएस स्विचिंग कार्यों के लिए जिम्मेदार है। जब ऐसा होता है, जैसा कि आपको संदेह था, यह वर्तमान टीएलबी को बचाता है और इसे अगले निर्धारित कार्य के लिए सहेजे गए टीएलबी द्वारा बदल देता है। इस तरह, प्रत्येक प्रक्रिया में एक TLB होता है, इसलिए 0x123456प्रक्रिया X में पता RAM में वास्तविक स्थान पर इंगित नहीं हो सकता है क्योंकि प्रक्रिया Y में समान पता या बस अमान्य हो सकता है। यदि कोई प्रक्रिया अपने पता स्थान के बाहर एक पॉइंटर को रोकने की कोशिश करती है, तो वह किसी अन्य प्रक्रिया के स्थान पर नहीं पहुंचती है, बल्कि यह कहीं नहीं पहुंचती है ।

  • ओएस यह तय करता है कि अपवाद होने पर क्या होता है। यह एक अमान्य मेमोरी एक्सेस (विभाजन दोष, सामान्य सुरक्षा दोष, ...) करने के लिए प्रक्रिया को समाप्त कर सकता है। यह वह तरीका भी है जिसमें स्वैपिंग को लागू किया जाता है: अपवाद हैंडलर स्वैप स्पेस से कुछ डेटा लाने का निर्णय ले सकता है, तदनुसार टीएलबी को अपडेट कर सकता है और फिर से एक्सेस कर सकता है।

ध्यान दें कि MMU सुरक्षा प्रदान करता है क्योंकि यह प्रक्रिया अपने TLB को बदल नहीं सकती है। केवल OS कर्नेल TLBs को बदल सकता है। टीएलबी परिवर्तन अनुमतियाँ कैसे काम करती हैं, इस उत्तर के दायरे से परे है।


6

1) Segfaults का पता स्मृति प्रबंधन इकाई द्वारा लगाया जाता है। जब आप मेमोरी के लिए पूछते हैं, तो OS मेमोरी मैनेजमेंट यूनिट को हार्डवेयर से कुछ प्राप्त करने के लिए कहता है। ऐसा कुछ होना चाहिए जो ओएस आपको देता है सभी बड़े मेमोरी ब्लॉकों का ट्रैक रखता है। MM तरह के हाथ जो MMU से बंद हैं। चूँकि यह आपको दी गई सभी मेमोरी को जानता है, यह आपको यह भी बता सकता है कि जब आप किसी मेमोरी लोकेशन को एक्सेस करने की कोशिश करते हैं जो आपको एलोकेशन से नहीं मिली है, तो OS में विशेष रूप से इसके लिए एक इवेंट है, मेमोरी जो आपके पास नहीं है। आखिरकार ओएस आपके ऐप को मार देता है, जिससे या तो सेगफॉल्ट या अन्य OSes के बराबर ट्रिगर हो जाता है।

सभी OS के पास यह सुरक्षा नहीं है। 9 तक के MacOS के पास इसका कोई विकल्प नहीं था, फिर भी MMU ने इसका समर्थन किया। न ही विन 3.1। Win95 में कुछ सुरक्षा थी, क्योंकि इसमें कोई सुरक्षा नहीं होने और फिर कुछ जोड़ने के बीच संक्रमण था।

2) OS को इसके अलावा कोई अन्य विवरण नहीं पता है। यदि आपके पास एक आवारा सूचक है जो स्मृति को एक्सेस करता है जिसे आपने कभी आवंटित नहीं किया है, तो यह पता है। यदि आपके पास ऐसा कोई है जो आपके एप्लिकेशन के किसी अन्य भाग में जाता है, तो यह निश्चित रूप से नहीं पता है। यह आपको भ्रष्ट करता है। यह वह जगह है जहां आपको भ्रष्ट ढेर मिलते हैं, आपके ऐप से आवारा पॉइंटर्स आपके ऐप के अन्य हिस्सों को ओवरराइट करते हैं।

तो, हाँ, आप अपने स्वयं के डेटा को खराब कर सकते हैं। यदि आपके पास एक आवारा सूचक है जो आपके स्वयं के ऐप को अधिलेखित करता है, तो आप अपने स्टैक को हिट करते हैं, क्योंकि यह संभवत: एक और उल्लंघन का मामला होगा जब आप स्टैक को वापस करने का प्रयास करते हैं, लेकिन यदि आप अपने स्वयं के डेटा को हिट करते हैं, तो आप कभी नहीं जान पाएंगे।

आप 'कोई सुरक्षा नहीं' की तुलना में अधिक सख्त होने की कोशिश कर सकते हैं, इलेक्ट्रिक फेंस ( http://perens.com/FreeSoftware/ElectricFence/ ) नामक एक उपकरण है जो आपके MMU को थोड़ा और अधिक काम करने के लिए ट्रिक करेगा, और इसका पता लगाने के लिए कारण होगा दोष।


ठीक है, क्या आप इस बारे में अधिक विशिष्ट हो सकते हैं कि यह कैसे काम करता है? जैसे, यह कैसे पता चलता है कि एक विशेष प्रक्रिया किसी विशेष स्थान तक नहीं पहुंच सकती है? यह क्या बताता है कि कौन सी प्रक्रियाएं कहां तक ​​पहुंच सकती हैं? यह कैसे भेद करता है? धन्यवाद
Doddy

1
@panic - विकिपीडिया में Memory_management_unit और उस पृष्ठ के लिंक देखें। ध्यान दें कि प्रक्रिया राज्य में MMU स्थिति शामिल है। आप MMU डिजाइन, सुविधाओं और एकीकरण पर सेमेस्टर खर्च कर सकते हैं।
mpez0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.