आपको समझना होगा कि वर्चुअल मेमोरी कैसे काम करती है, और कैसे एक एमएमयू मैपिंग असली रैम से संबंधित है।
असली रैम पृष्ठों में विभाजित है, पारंपरिक रूप से 4kB प्रत्येक। प्रत्येक प्रक्रिया में अपना स्वयं का एमएमयू मैपिंग होता है, जो उस प्रक्रिया को एक रैखिक मेमोरी स्पेस (32-बिट लिनक्स में 4 जीबी) प्रस्तुत करता है। बेशक, उन सभी को वास्तव में आवंटित नहीं किया जाता है। सबसे पहले, यह लगभग खाली है, कि कोई वास्तविक पृष्ठ अधिकांश पते से जुड़ा हुआ नहीं है।
जब प्रक्रिया गैर-आवंटित पते (या तो इसे पढ़ने, लिखने या निष्पादित करने की कोशिश कर रही है) को हिट करती है, तो एमएमयू एक गलती उत्पन्न करता है (एक बाधा के समान), और वीएम सिस्टम का आह्वान किया जाता है। यदि यह निर्णय लेता है कि कुछ रैम वहां होना चाहिए, तो यह उस अप्रयुक्त RAM पृष्ठ को जोड़ता है और उस पता सीमा के साथ सहयोग करता है।
इस तरह, कर्नेल इस बात की परवाह नहीं करता कि प्रक्रिया मेमोरी का उपयोग कैसे करती है, और प्रक्रिया वास्तव में परवाह नहीं करती है कि रैम कितनी रैम है, इसमें हमेशा एक ही रैखिक 4 जीबी पता स्थान होगा।
अब, brk/sbrk
थोड़ा उच्च स्तर पर काम करता है: सिद्धांत रूप में किसी भी स्मृति पते 'उससे परे' चिह्न अमान्य है और यदि पहुंचने पर रैम पेज नहीं मिलेगा, तो प्रक्रिया को इसके बजाय मार दिया जाएगा। उपयोगकर्ता स्पेस लाइब्रेरी इस सीमा के भीतर स्मृति आवंटन प्रबंधित करता है, और केवल तभी जब कर्नेल इसे बढ़ाने के लिए कहता है।
लेकिन अगर किसी प्रक्रिया को अधिकतम अनुमति के लिए brk
सेट करके शुरू किया गया है, तो यह वास्तविक RAM पृष्ठों को तब तक आवंटित नहीं किया जाएगा जब तक कि यह सभी स्मृति पते तक पहुंचने शुरू न हो जाए।
होता है तो सीआर 3 रजिस्टर में सेट किया जाता है "(एसआरबीके ब्रिक के चारों ओर एक ग्लिबैक रैपर है)" - मुझे ढूंढने का प्रयास करने में कठिन समय हो रहा था sbrk के लिए सिस्टम कॉल। कोई नहीं है, अब समझ में आता है। – automaton