İş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?
C
Varsayı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] = f0ceabe0
ve&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] = b6b36690
ve&a[n-1] = b763068f
Proc haritaları yığını gösterir: 7fffb6b35000-7fffb7633000. (11256 * 1024B)
ulimit -s
10240
bilgisayarı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?