লিনাক্সে, সঠিক পদ্ধতিটি এখানে দেওয়া হয়েছে: বেনামে ম্যাপিংগুলিতে একটি পৃষ্ঠা ত্রুটি পরিচালনা করার ক্ষেত্রে আপনি এটি পরীক্ষা করে দেখেছেন যে এটি একটি "বর্ধিত বরাদ্দ" কিনা যা আপনার স্ট্যাকের মতো প্রসারিত করা উচিত whether যদি ভিএম এরিয়া রেকর্ডটি বলে যে আপনার উচিত, তবে আপনি স্ট্যাকটি প্রসারিত করার জন্য সূচনা ঠিকানাটি সামঞ্জস্য করুন।
ঠিকানার উপর নির্ভর করে কোনও পৃষ্ঠার ত্রুটি দেখা দিলে এটি স্ট্যাক বিস্তারের মাধ্যমে পরিবেশন করা যেতে পারে (এবং ফল্টটি বাতিল করা হয়েছে)। ভার্চুয়াল মেমরির জন্য এই "ফল্টের নীচে ক্রমবর্ধমান" আচরণের জন্য সিস্কেলটিতে MAP_GROWSDOWN
পতাকাটি পাঠানো স্বেচ্ছাচারী ব্যবহারকারী প্রোগ্রামগুলির দ্বারা অনুরোধ করা যেতে পারে mmap
।
আপনি কোনও ব্যবহারকারী প্রোগ্রামেও এই প্রক্রিয়াটির সাথে গোলমাল করতে পারেন:
#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
এবং আসল অঞ্চলটি কীভাবে বৃদ্ধি পেয়েছে তা দেখুন look
ulimit -s
) দ্বারা সীমাবদ্ধ হয় ।