İşletim sistemi, yığın veya başka bir şey için sabit miktarda geçerli sanal alan ayırıyor mu? Yalnızca büyük yerel değişkenler kullanarak yığın taşması üretebilir miyim?
CVarsayımı sınamak için küçük bir program yazdım . X86-64 CentOS 6.5 üzerinde çalışıyor.
#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;
}
Programı çalıştırmak &a[0] = f0ceabe0ve&a[n-1] = f16eabdf
Proc haritaları yığını gösterir: 7ffff0cea000-7ffff16ec000. (10248 * 1024B)
Sonra artmaya çalıştım n = 11240 * 1024
Programı çalıştırmak &a[0] = b6b36690ve&a[n-1] = b763068f
Proc haritaları yığını gösterir: 7fffb6b35000-7fffb7633000. (11256 * 1024B)
ulimit -s10240bilgisayarımda yazdırır .
Gördüğünüz gibi, her iki durumda da yığın boyutu verilenden daha büyüktür ulimit -s. Ve yığın daha büyük yerel değişkenle büyür. Yığının üstü bir şekilde 3-5kB daha fazla &a[0](AFAIK kırmızı bölge 128B).
Peki bu yığın haritası nasıl tahsis edilir?