OS가 스택 또는 다른 것에 대해 고정 된 양의 유효한 가상 공간을 예약합니까? 큰 지역 변수를 사용하여 스택 오버플로를 생성 할 수 있습니까?
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
내 PC에 인쇄합니다 .
보시다시피, 두 경우 모두 스택 크기가 ulimit -s
제공 하는 것보다 큽니다 . 스택은 더 큰 지역 변수로 커집니다. 스택 상단은 3 ~ 5kB 더 많이 떨어져 있습니다 &a[0]
(빨간색 영역은 128B입니다).
이 스택 맵은 어떻게 할당됩니까?