getrlimit (2) hat in den Manpages folgende Definition:
RLIMIT_AS Die maximale Größe des virtuellen Speichers (Adressraum) des Prozesses in Byte. Dieses Limit wirkt sich auf Aufrufe von brk (2), mmap (2) und mremap (2) aus, die beim Überschreiten dieses Limits mit dem Fehler ENOMEM fehlschlagen. Auch die automatische Stapelerweiterung schlägt fehl (und generiert ein SIGSEGV, das den Prozess abbricht, wenn kein alternativer Stapel über Sigaltstack (2) verfügbar gemacht wurde). Da der Wert a long ist, beträgt dieser Grenzwert auf Computern mit einer Länge von 32 Bit höchstens 2 GiB, oder diese Ressource ist unbegrenzt.
Was ist hier mit "automatischer Stapelerweiterung" gemeint? Wächst der Stack in einer Linux / UNIX-Umgebung nach Bedarf? Wenn ja, welchen genauen Mechanismus gibt es?
ulimit -s
) begrenzt.Der genaue Mechanismus ist hier unter Linux angegeben: Wenn Sie einen Seitenfehler bei anonymen Zuordnungen behandeln , überprüfen Sie , ob es sich um eine "gewachsene Do-Zuweisung" handelt , die Sie wie einen Stapel erweitern sollten. Wenn der VM-Bereichsdatensatz angibt, dass Sie sollten, passen Sie die Startadresse an, um den Stapel zu erweitern.
Wenn ein Seitenfehler auftritt, kann er abhängig von der Adresse über die Stapelerweiterung behoben (und der Fehler gelöscht) werden. Dieses Verhalten für den virtuellen Speicher, das bei einem Fehler nach unten wächst, kann von beliebigen Benutzerprogrammen angefordert werden, wobei das
MAP_GROWSDOWN
Flag an denmmap
Systemaufruf übergeben wird.Mit diesem Mechanismus können Sie auch in einem Anwenderprogramm herumspielen:
Wenn Sie dazu aufgefordert werden, finden Sie die PID des Programms (über
ps
) und sehen/proc/$THAT_PID/maps
, wie der ursprüngliche Bereich gewachsen ist.quelle