ওএস কি স্ট্যাক বা অন্য কিছুর জন্য স্থির পরিমাণের বৈধ ভার্চুয়াল স্থান সংরক্ষণ করে? আমি কি কেবল বড় স্থানীয় ভেরিয়েবলগুলি ব্যবহার করে একটি স্ট্যাক ওভারফ্লো উত্পাদন করতে সক্ষম?
আমি C
আমার অনুমানটি পরীক্ষা করার জন্য একটি ছোট প্রোগ্রাম লিখেছি । এটি X86-64 CentOS 6.5 এ চলছে।
#include <string.h>
#include <stdio.h>
int main()
{
int n = 10240 * 1024;
char a[n];
memset(a, 'x', n);
printf("%x\n%x\n", &a[0], &a[n-1]);
getchar();
return 0;
}
প্রোগ্রাম রানিং দেয় &a[0] = f0ceabe0
এবং&a[n-1] = f16eabdf
প্রকল্পের মানচিত্রগুলি স্ট্যাকটি দেখায়: 7ffff0cea000-7ffff16ec000. (10248 * 1024B)
তারপরে আমি বাড়ানোর চেষ্টা করেছি n = 11240 * 1024
প্রোগ্রাম রানিং দেয় &a[0] = b6b36690
এবং&a[n-1] = b763068f
প্রকল্পের মানচিত্রগুলি স্ট্যাকটি দেখায়: 7fffb6b35000-7fffb7633000. (11256 * 1024B)
ulimit -s
10240
আমার পিসিতে মুদ্রণ ।
আপনি দেখতে পাচ্ছেন, উভয় ক্ষেত্রেই স্ট্যাকের আকারটি যা ulimit -s
দেয় তার চেয়ে বড় । এবং স্ট্যাক বড় স্থানীয় ভেরিয়েবলের সাথে বৃদ্ধি পায়। স্ট্যাকের শীর্ষটি কোনওভাবে 3-5 কেবি আরও বন্ধ &a[0]
(এএফআইএইচ রেড জোনটি 128 বি)।
তাহলে এই স্ট্যাক মানচিত্রটি কীভাবে বরাদ্দ পাওয়া যায়?