La zona roja es, pura y simplemente, una optimización que puede guardar instrucciones. Significa que ya no es necesario que el código emitido para cada función se reste del puntero de la pila para hacer el almacenamiento local de esta manera
sub XXX, %rsp
al comienzo de cada llamada de función, incluso si no son funciones de hoja. Muchas veces el código emitido por el compilador puede usar el espacio temporal en la zona roja debajo del puntero de la pila sin necesidad de guardarlo y antes de llamar a otras funciones. Esta es una optimización útil para tener disponible.
Si ya no tiene que sub desde el puntero de la pila, el código emitido puede usar rsp como puntero base, un trabajo normalmente reservado para rbp, y el código emitido puede usar rbp como otro registro de propósito general.
En última instancia, esto significa que el prólogo y el epílogo de cada llamada de función pueden guardar dos instrucciones que guardarían y restaurarían rbp:
(ensamblador de GNU)
pushq %rbp # prologue [ two instructions not necessary ]
movq %rsp,%rbp
.... [code]
movq %rbp,%rsp # epilogue [ two instructions not necessary ]
popq %rbp
Tenga en cuenta que en gcc puede pasar el indicador -mno-red-zone si no lo desea (pero la ABI x86-64 lo requiere). El kernel de Linux no necesita ser compatible con ABI y, por lo tanto, todo el código del kernel se compila con -mno-red-zone.
Además, acceder a la memoria más allá del puntero de la pila no es peligroso si ese es el modo de operación esperado. Es solo peligroso y puede conducir a la corrupción cuando no es planeado e inesperado. Cuando el código emitido lo hace, sabe lo que está haciendo.
%rsp
como puntero base de cualquier manera.