Красная зона - это просто оптимизация, которая может сохранить инструкции. Это означает, что для выдаваемого кода больше нет необходимости, чтобы каждая функция вычитала из указателя стека, чтобы сделать локальное хранилище следующим образом
sub XXX, %rsp
в начале каждого вызова функции, даже если они не являются конечными функциями. Часто код, генерируемый компилятором, может использовать временное пространство в красной зоне под указателем стека без необходимости его сохранения и перед вызовом других функций. Это полезная оптимизация, чтобы иметь в наличии.
Если вам больше не нужно переходить от указателя стека, выданный код может использовать rsp в качестве базового указателя, задание, обычно зарезервированное для rbp, а выданный код может использовать rbp в качестве другого регистра общего назначения.
В конечном итоге это означает, что пролог и эпилог каждого вызова функции могут сохранить две инструкции, которые сохранят и восстановят rbp:
(гну ассемблер)
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, если вы этого не хотите (но ABI x86-64 требует этого). Ядро Linux не обязательно должно быть ABI-совместимым, и поэтому весь код ядра компилируется с -mno-red-zone.
Кроме того, доступ к памяти за указателем стека не опасен, если это ожидаемый режим работы. Это только опасно и может привести к коррупции, когда она незапланированная и неожиданная. Когда выпущенный код делает это, он знает, что делает.
%rsp
в качестве базового указателя в любом случае.