Die rote Zone ist einfach eine Optimierung, die Anweisungen speichern kann. Es bedeutet, dass der ausgegebene Code nicht mehr für jede Funktion vom Stapelzeiger subtrahiert werden muss, um die lokale Speicherung so zu gestalten
sub XXX, %rsp
am Anfang jedes Funktionsaufrufs, auch wenn es sich nicht um Blattfunktionen handelt. Häufig kann der vom Compiler ausgegebene Code den temporären Platz in der roten Zone unter dem Stapelzeiger verwenden, ohne dass er gespeichert werden muss und bevor andere Funktionen aufgerufen werden. Dies ist eine nützliche Optimierung.
Wenn Sie den Stapelzeiger nicht mehr übergeben müssen, kann der ausgegebene Code rsp als Basiszeiger verwenden, einen Job, der normalerweise für rbp reserviert ist, und der ausgegebene Code kann rbp als ein anderes Universalregister verwenden.
Dies bedeutet letztendlich, dass der Prolog und der Epilog jedes Funktionsaufrufs zwei Anweisungen speichern können, die rbp speichern und wiederherstellen würden:
(Gnu Assembler)
pushq %rbp # prologue [ two instructions not necessary ]
movq %rsp,%rbp
.... [code]
movq %rbp,%rsp # epilogue [ two instructions not necessary ]
popq %rbp
Beachten Sie, dass Sie in gcc das Flag -mno-red-zone übergeben können, wenn Sie es nicht möchten (aber das x86-64-ABI erfordert es). Der Linux-Kernel muss nicht ABI-konform sein und daher wird der gesamte Kernel-Code mit -mno-red-zone kompiliert.
Darüber hinaus ist der Zugriff auf den Speicher über den Stapelzeiger hinaus nicht gefährlich, wenn dies der erwartete Betriebsmodus ist. Es ist nur gefährlich und kann zu Korruption führen, wenn es ungeplant und unerwartet ist. Wenn der ausgegebene Code dies tut, weiß er, was er tut.
%rsp
in beide Richtungen als Basiszeiger verwendet.