Чи ОС залишає фіксовану кількість дійсного віртуального простору для стека чи чогось іншого? Чи можу я створити переповнення стека лише за допомогою великих локальних змінних?
Я написав невелику 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
Карти proc показує стек: 7ffff0cea000-7ffff16ec000. (10248 * 1024B)
Потім я спробував збільшити n = 11240 * 1024
Запуск програми дає &a[0] = b6b36690
і&a[n-1] = b763068f
Карти proc показує стек: 7fffb6b35000-7fffb7633000. (11256 * 1024B)
ulimit -s
відбитки 10240
в моєму ПК.
Як бачите, в обох випадках розмір стека більший, ніж ulimit -s
дає. І стек росте з більшою локальною змінною. Верхня частина стека якась на 3-5 кБ більше &a[0]
(AFAIK червона зона - 128B).
Отже, як ця карта стека виділяється?