回答:
レッドゾーンは、純粋かつ単純に、命令を保存できる最適化です。これは、すべての関数の発行コードがスタックポインターから減算してローカルストレージを作成する必要がなくなったことを意味します。
sub XXX, %rsp
リーフ関数ではない場合でも、すべての関数呼び出しの開始時に。多くの場合、コンパイラから出力されたコードは、スタックポインターの下にあるレッドゾーンの一時スペースを、保存する必要なく他の関数を呼び出す前に使用できます。これは、利用可能な便利な最適化です。
スタックポインターからサブする必要がなくなった場合、発行されたコードはrspをベースポインターとして使用でき、ジョブは通常rbpに予約され、発行されたコードはrbpを別の汎用レジスターとして使用できます。
これは最終的に、各関数呼び出しのプロローグとエピローグが、rbpを保存および復元する2つの命令を保存できることを意味します。
(GNUアセンブラー)
pushq %rbp # prologue [ two instructions not necessary ]
movq %rsp,%rbp
.... [code]
movq %rbp,%rsp # epilogue [ two instructions not necessary ]
popq %rbp
gccでは、不要な場合は-mno-red-zoneフラグを渡すことができます(ただし、x86-64 ABIでは必要です)。LinuxカーネルはABIに準拠する必要はないため、すべてのカーネルコードは-mno-red-zoneでコンパイルされます。
さらに、スタックポインタを超えてメモリにアクセスすることは、それが予期される動作モードであれば危険ではありません。それは危険であるだけで、計画外で予期しないときに破損を引き起こす可能性があります。発行されたコードがそれを行うとき、それは何をしているかを知っています。
%rsp
どちらの方法でもベースポインターとして使用してスタックのインデックスを作成できます。