2013-06-07 6 views
5

32 बिट सिस्टम में, प्रत्येक प्रक्रिया में लगभग 2^32 बाइट्स CONTIGUOUS पता स्थान होता है। तो एक लिंकर द्वारा उत्पन्न अंतिम निष्पादन योग्य कोड को स्थानांतरित करने की आवश्यकता क्यों है। आवश्यकता क्या है क्योंकि उत्पन्न सभी पते प्रक्रिया के स्वयं के पता स्थान में वर्चुअल पते होंगे और अन्य प्रक्रिया इसका उपयोग नहीं कर सकती है। इसलिए प्रक्रिया को कहीं भी कहीं भी रखा जा सकता है। क्यों स्थानांतरित हो सकता है?वर्चुअल मेमोरी और रिलायटेबल कोड

+0

इसे जांचें: http: //stackoverflow.com/questions/7193888/load-time-relocation-and-virtual-memory – mohit

उत्तर

-1

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

इसलिए बयान करने के लिए कार्यों को कॉल करते थे, उसके अनुसार उन कार्यों

+1

लेकिन एमएमयू (मेमोरी मैनेजमेंट यूनिट) द्वारा इसकी देखभाल की जाएगी। स्थानांतरण के साथ क्या करना है। – user1863877

2

कुछ ऑपरेटिंग सिस्टम निष्पादन योग्य कोड पुनर्निधारणीय बनाने के वास्तविक पते की ओर इशारा करते अद्यतन करने की आवश्यकता है (यह निश्चित रूप से सभी ऑपरेटिंग सिस्टम के लिए सार्वभौमिक नहीं है) आदि रिटर्न address space layout randomization के लिए अनुमति दें। यह कुछ हमलों को कम करने में मदद करता है।

अतीत में जब ढेर निष्पादन योग्य होते थे तो निष्पादन योग्य कोड को सीधे ओवरफ्लोल्ड स्टैक या ढेर पर लिखकर एक बफर ओवरफ़्लो का शोषण किया जा सकता था। चूंकि ऑपरेटिंग सिस्टम बेहतर हो गए और ढेर और ढेर के निष्पादन को रोकना शुरू कर दिया, हमले अधिक परिष्कृत हो गए और return oriented programming कर मेमोरी में ज्ञात कोड अनुक्रमों का उपयोग करना शुरू कर दिया। हमले के उस वर्ग के लिए शमन को पहली बार साझा पुस्तकालयों के लिए मेमोरी लेआउट को यादृच्छिक रूप से याद किया गया था (क्योंकि उनको शोषण करना आसान था) और फिर जब हमलावरों ने निष्पादन योग्य की स्मृति स्थिति को यादृच्छिक रूप से मुख्य निष्पादन योग्य पर हमला करने के लिए स्विच किया। इसे संभव बनाने के लिए मुख्य निष्पादन योग्य को स्थानांतरित करने की आवश्यकता है।

1

निष्पादन योग्य कोड में हमेशा सापेक्ष पते नहीं होते हैं। विंडोज़ पर, उदाहरण के लिए, एड्रेसिंग अक्सर पूर्ण होती है (उदाहरण के लिए वैश्विक डेटा के लिए)।

दो अलग-अलग गतिशील पुस्तकालयों पर विचार करें। दोनों को 0x00100000 के एक निश्चित आधार पते के लिए संकलित किया गया था। आपका प्रोग्राम दोनों को लोड करने का प्रयास करता है। दूसरा डीएलएल रखने के लिए लोडर कहां है? इसका पसंदीदा आधार पता पहले से ही अन्य डीएलएल द्वारा उपयोग किया जाता है।

इस मामले में स्थानांतरित करने योग्य कोड दूसरे डीएलएल को एक अलग पते पर रखने और नए आंतरिक स्थान पर अपने आंतरिक पॉइंटर्स को पैच करने में मदद करता है। निश्चित आधार पते के साथ, दूसरा डीएलएल लोड करना बस असफल हो जाएगा।

संबंधित मुद्दे