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 CProgramm 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] = f0ceabe0und&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] = b6b36690und&a[n-1] = b763068f
Die Proc Maps zeigen den Stack: 7fffb6b35000-7fffb7633000. (11256 * 1024B)
ulimit -sdruckt 10240in 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?