ระบบปฏิบัติการสำรองพื้นที่เสมือนที่ถูกต้องตามจำนวนที่แน่นอนสำหรับกองซ้อนหรืออย่างอื่นหรือไม่? ฉันสามารถสร้าง stack overflow โดยใช้ตัวแปรท้องถิ่นขนาดใหญ่ได้หรือไม่?
ฉันได้เขียน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-5kB &a[0]
(AFAIK โซนสีแดงคือ 128B)
ดังนั้นแผนที่สแต็กนี้ได้รับการจัดสรรอย่างไร