लिनक्स पर सटीक तंत्र यहां दिया गया है: अनाम मैपिंग पर एक पृष्ठ दोष को संभालने के लिए आप यह देखने के लिए जांचें कि क्या यह "बड़ा हो गया आवंटन" है जिसे आपको स्टैक की तरह विस्तारित करना चाहिए। यदि वीएम क्षेत्र रिकॉर्ड कहता है कि आपको चाहिए, तो आप स्टैक का विस्तार करने के लिए प्रारंभ पता समायोजित करें।
जब पृष्ठ दोष होता है, तो पते के आधार पर, इसे स्टैक विस्तार के माध्यम से सेवित किया जा सकता है। वर्चुअल मेमोरी के लिए यह "गलती से नीचे की ओर बढ़ रहा है" व्यवहार को मनमाने ढंग से उपयोगकर्ता कार्यक्रमों द्वारा अनुरोध किया जा सकता है, MAP_GROWSDOWN
ध्वज के साथ mmap
syscall को पारित किया जा सकता है।
आप इस तंत्र के साथ एक उपयोगकर्ता कार्यक्रम में भी गड़बड़ कर सकते हैं:
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
int main() {
long page_size = sysconf(_SC_PAGE_SIZE);
void *mem = mmap(NULL, page_size, PROT_READ|PROT_WRITE, MAP_GROWSDOWN|MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
if (MAP_FAILED == mem) {
perror("failed to create growsdown mapping");
return EXIT_FAILURE;
}
volatile char *tos = (char *) mem + page_size;
int i;
for (i = 1; i < 10 * page_size; ++i)
tos[-i] = 42;
fprintf(stderr, "inspect mappping for originally page-sized %p in /proc... press any key to continue...\n", mem);
(void) getchar();
if (munmap(mem, page_size))
perror("failed munmap");
return EXIT_SUCCESS;
}
जब यह संकेत देता है कि आप कार्यक्रम के माध्यम से ( ps
) के माध्यम से पीआईडी /proc/$THAT_PID/maps
को देखें और देखें कि मूल क्षेत्र कैसे विकसित हुआ है।
ulimit -s
) तक सीमित होता है ।