मैड्स ने इंगित किया कि, नल पॉइंटर्स के माध्यम से अधिकतर पहुंच प्राप्त करने के लिए, यूनिक्स-जैसी प्रणाली पृष्ठ को शून्य "अप्रयुक्त" पते पर बनाती है। इस प्रकार, एक्सेस एक सीपीयू अपवाद को तुरंत ट्रिगर करता है, दूसरे शब्दों में एक segfault। आवेदन को बदनाम करने से यह काफी बेहतर है। अपवाद वेक्टर तालिका, हालांकि, कम से कम x86 प्रोसेसर पर किसी भी पते पर हो सकती है (इसके लिए एक विशेष रजिस्टर है, lidt
ऑपोड के साथ लोड किया गया है)।
प्रारंभ बिंदु बिंदु सम्मेलनों के एक समूह का हिस्सा है जो वर्णन करता है कि स्मृति कैसे निर्धारित की जाती है। लिंकर, जब यह निष्पादन योग्य बाइनरी उत्पन्न करता है, तो इन सम्मेलनों को जानना चाहिए, इसलिए उन्हें बदलने की संभावना नहीं है। मूल रूप से, लिनक्स के लिए, स्मृति लेआउट सम्मेलन को 90 के दशक के आरंभ में लिनक्स के पहले संस्करणों से विरासत में मिलाया जाता है। एक प्रक्रिया में कई क्षेत्रों तक पहुंच होनी चाहिए:
- कोड एक श्रेणी में होना चाहिए जिसमें प्रारंभिक बिंदु शामिल है।
- वहां एक ढेर होना चाहिए।
brk()
और sbrk()
सिस्टम कॉल के साथ बढ़ी सीमा के साथ एक ढेर होना चाहिए।
- साझा लाइब्रेरी लोडिंग सहित
mmap()
सिस्टम कॉल के लिए कुछ कमरा होना चाहिए।
आजकल, ढेर, जहां malloc()
चला जाता है, mmap()
कॉल जो जो कुछ भी पता गिरी फिट देखता है पर स्मृति का हिस्सा प्राप्त द्वारा समर्थित है। लेकिन पुराने समय में, लिनक्स पिछले यूनिक्स जैसी प्रणालियों की तरह था, और इसके ढेर को एक निर्बाध खंड में एक बड़ा क्षेत्र चाहिए, जो बढ़ते पते की ओर बढ़ सकता है। तो जो कुछ भी सम्मेलन था, उसे कोड को भरना था और कम पते की तरफ ढेर करना था, और ढेर को दिए गए बिंदु के बाद पता स्थान के हर हिस्से को देना था।
लेकिन स्टैक भी है, जो आमतौर पर काफी छोटा होता है लेकिन कुछ मौकों पर काफी नाटकीय रूप से बढ़ सकता है। ढेर बढ़ता है, और जब ढेर भरा होता है, हम वास्तव में प्रक्रिया को कुछ डेटा ओवरराइट करने की बजाए अनुमानित रूप से क्रैश करना चाहते हैं। तो उस क्षेत्र के निचले सिरे पर, एक अप्रत्याशित पृष्ठ के साथ, स्टैक के लिए एक विस्तृत क्षेत्र होना था। और लो! नल पॉइंटर डिटेरेंस को पकड़ने के लिए, शून्य पते पर एक अनपढ़ पृष्ठ है। इसलिए यह परिभाषित किया गया था कि पहले पृष्ठ को छोड़कर, स्टैक को पहले 128 एमबी पता स्थान मिलेगा। इसका मतलब है कि 0x080xxxxx के समान पते पर कोड 128 एमबी के बाद जाना था।
जैसा कि माइकल बताते हैं, 128 एमबी पता स्थान "खोना" कोई बड़ा सौदा नहीं था क्योंकि वास्तव में उपयोग किए जा सकने वाले संबंधों के संबंध में पता स्थान बहुत बड़ा था। उस समय, लिनक्स कर्नेल एक ही प्रक्रिया के लिए एड्रेस स्पेस को 1 जीबी तक सीमित कर रहा था, हार्डवेयर द्वारा अधिकतम 4 जीबी की अनुमति थी, और इसे एक बड़ा मुद्दा नहीं माना जाता था।
यदि '0x08048000' कभी भी' STACK_TOP' था, तो यह _very_ बहुत पहले था। उत्तरार्द्ध [2.0.40] (http://lxr.free-electrons.com/source/include/asm-i386/a.out.h?v=2.0.40#L22) के लिए सभी तरह से 'TASK_SIZE' है) । –