Hệ điều hành có dành một lượng không gian ảo hợp lệ cố định cho ngăn xếp hay thứ gì khác không? Tôi có thể tạo ra một ngăn xếp tràn chỉ bằng cách sử dụng các biến cục bộ lớn không?
Tôi đã viết một C
chương trình nhỏ để kiểm tra giả định của mình. Nó đang chạy trên 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;
}
Chạy chương trình cho &a[0] = f0ceabe0
và&a[n-1] = f16eabdf
Các bản đồ Proc hiển thị ngăn xếp: 7ffff0cea000-7ffff16ec000. (10248 * 1024B)
Sau đó tôi đã cố gắng tăng n = 11240 * 1024
Chạy chương trình cho &a[0] = b6b36690
và&a[n-1] = b763068f
Các bản đồ Proc hiển thị ngăn xếp: 7fffb6b35000-7fffb7633000. (11256 * 1024B)
ulimit -s
in 10240
trong PC của tôi.
Như bạn có thể thấy, trong cả hai trường hợp, kích thước ngăn xếp đều lớn hơn so với kích thước ulimit -s
. Và ngăn xếp phát triển với biến cục bộ lớn hơn. Đỉnh của ngăn xếp bằng cách nào đó giảm thêm 3-5kB &a[0]
(AFAIK vùng màu đỏ là 128B).
Vậy làm thế nào để bản đồ ngăn xếp này được phân bổ?