Benoit's answer to question 3 पर विस्तार ...
ऐसे तार्किक भागों में कार्यक्रमों का विभाजन कोड, निरंतर डेटा, संशोधित डेटा और स्टैक अलग-अलग एजेंटों द्वारा समय पर अलग-अलग बिंदुओं पर किया जाता है।
सबसे पहले, आपका कंपाइलर (और लिंकर) निष्पादन योग्य फाइल बनाता है जहां यह विभाजन निर्दिष्ट है। यदि आप कई निष्पादन योग्य फ़ाइल स्वरूप (पीई, ईएलएफ, आदि) देखते हैं, तो आप देखेंगे कि वे किसी प्रकार के सेक्शन या सेगमेंट या जो भी आप इसे कॉल करना चाहते हैं, का समर्थन करते हैं। फ़ाइल के भीतर पते और आकार और स्थानों के अलावा, उन अनुभागों में ओएस को इन वर्गों के उद्देश्य को बताने वाले गुण होते हैं, उदा। इस खंड में कोड (और यहां प्रविष्टि बिंदु है), यह - प्रारंभिक स्थिर डेटा, - - प्रारंभिक डेटा (आमतौर पर फ़ाइल में स्थान नहीं ले रहा है), यहां स्टैक के बारे में कुछ है, निर्भरता की सूची (जैसे डीएलएल) है, इत्यादि
अगला, जब ओएस प्रोग्राम को निष्पादित करना शुरू करता है, तो यह देखने के लिए फ़ाइल को पार्स करता है कि प्रोग्राम को कितनी मेमोरी चाहिए, जहां और प्रत्येक अनुभाग के लिए स्मृति सुरक्षा की आवश्यकता है। उत्तरार्द्ध आमतौर पर पेज टेबल के माध्यम से किया जाता है। कोड पृष्ठों को निष्पादन योग्य और केवल पढ़ने के रूप में चिह्नित किया जाता है, निरंतर डेटा पृष्ठों को निष्पादन योग्य और केवल पढ़ने के लिए चिह्नित नहीं किया जाता है, अन्य डेटा पेज (स्टैक सहित) को निष्पादन योग्य और पढ़ने-लिखने के रूप में चिह्नित नहीं किया जाता है। इस तरह यह सामान्य रूप से होना चाहिए।
कई बार कार्यक्रमों को पढ़ने-लिखने की आवश्यकता होती है, साथ ही, गतिशील रूप से जेनरेट किए गए कोड के लिए निष्पादन योग्य क्षेत्र या केवल मौजूदा कोड को संशोधित करने में सक्षम होना चाहिए। संयुक्त आरडब्ल्यूएक्स एक्सेस या तो निष्पादन योग्य फ़ाइल में निर्दिष्ट किया जा सकता है या रन टाइम पर अनुरोध किया जा सकता है।
गतिशील स्टैक विस्तार के लिए गार्ड पेज जैसे अन्य विशेष पृष्ठ हो सकते हैं, वे स्टैक पृष्ठों के बगल में स्थित हैं। उदाहरण के लिए, आपका प्रोग्राम 64 केबी स्टैक के लिए आवंटित पर्याप्त पृष्ठों से शुरू होता है और फिर जब प्रोग्राम उस बिंदु से परे पहुंचने का प्रयास करता है, तो ओएस उन गार्ड पृष्ठों तक पहुंच को रोकता है, स्टैक के लिए अधिक पृष्ठों को आवंटित करता है (अधिकतम समर्थित आकार तक) और गार्ड पेज आगे बढ़ता है। इन पृष्ठों को निष्पादन योग्य फ़ाइल में निर्दिष्ट करने की आवश्यकता नहीं है, ओएस उन्हें स्वयं ही संभाल सकता है। फ़ाइल केवल स्टैक आकार और शायद स्थान निर्दिष्ट करनी चाहिए।
यदि ओएस में डेटा मेमोरी से कोड मेमोरी को अलग करने या मेमोरी एक्सेस अधिकारों को लागू करने के लिए कोई हार्डवेयर या कोड नहीं है, तो विभाजन बहुत औपचारिक है। 16-बिट रीयल-मोड डॉस प्रोग्राम्स (COM और EXE) में कुछ विशेष तरीके से चिह्नित कोड, डेटा और स्टैक सेगमेंट नहीं थे। COM कार्यक्रमों में सब कुछ एक सामान्य 64 केबी सेगमेंट में था और उन्होंने आईपी = 0x100 और एसपी = 0xFFxx के साथ शुरू किया और कोड और डेटा का क्रम मनमाने ढंग से अंदर हो सकता है, वे व्यावहारिक रूप से स्वतंत्र रूप से intertwine सकता है। डॉस EXE फ़ाइलों ने केवल प्रारंभिक सीएस निर्दिष्ट किया: आईपी और एसएस: एसपी स्थान और इससे परे कि कोड, डेटा और स्टैक सेगमेंट डॉस के लिए अलग-अलग थे। इसे करने की आवश्यकता है फ़ाइल को लोड करना, स्थानांतरण करना (केवल EXEs के लिए), पीएसपी (प्रोग्राम सेगमेंट उपसर्ग, जिसमें कमांड लाइन पैरामीटर और कुछ अन्य नियंत्रण जानकारी शामिल है) सेट करें, एसएस: एसपी और सीएस: आईपी लोड करें।यह स्मृति की रक्षा नहीं कर सका क्योंकि वास्तविक सुरक्षा मोड में स्मृति सुरक्षा उपलब्ध नहीं है, और इसलिए 16-बिट डॉस निष्पादन योग्य प्रारूप बहुत ही सरल थे।
महान जवाब, धन्यवाद! –
@AntonFrolov यदि आपके प्रश्न का उत्तर दिया गया है, तो सबसे अच्छा जवाब स्वीकार करने के लिए मत भूलना। –