Reserviert das Betriebssystem die festgelegte Menge des gültigen virtuellen Speicherplatzes für den Stapel oder etwas anderes? Kann ich einen Stapelüberlauf nur mit großen lokalen Variablen erzeugen?
Ich habe ein kleines C
Programm geschrieben, um meine Vermutung zu testen. Es läuft auf 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;
}
Das Ausführen des Programms gibt &a[0] = f0ceabe0
und&a[n-1] = f16eabdf
Die Proc Maps zeigen den Stack: 7ffff0cea000-7ffff16ec000. (10248 * 1024B)
Dann habe ich versucht zu erhöhen n = 11240 * 1024
Das Ausführen des Programms gibt &a[0] = b6b36690
und&a[n-1] = b763068f
Die Proc Maps zeigen den Stack: 7fffb6b35000-7fffb7633000. (11256 * 1024B)
ulimit -s
druckt 10240
in meinem PC.
Wie Sie sehen, ist in beiden Fällen der Stapel größer als der angegebene ulimit -s
. Und der Stapel wächst mit einer größeren lokalen Variablen. Die Oberseite des Stapels ist irgendwie 3-5kB mehr entfernt &a[0]
(AFAIK die rote Zone ist 128B).
Wie wird diese Stapelzuordnung zugewiesen?