Какова цель красной зоны?

12

Красная зона - это область фиксированного размера в памяти за указателем стека, которая не была «выделена». Компиляторы генерируют сборку для доступа к этой области с помощью простых конечных функций.

Но я не вижу реальных преимуществ для красной зоны. Доступ к памяти за указателем стека действительно опасен и может легко привести к повреждению данных . Зачем вообще это делать? Сохранение двух инструкций процессора (push ebp; mov ebp esp) не даст реальной скорости.

Александр Дзёба
источник

Ответы:

16

Красная зона - это просто оптимизация, которая может сохранить инструкции. Это означает, что для выдаваемого кода больше нет необходимости, чтобы каждая функция вычитала из указателя стека, чтобы сделать локальное хранилище следующим образом

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.

Кроме того, доступ к памяти за указателем стека не опасен, если это ожидаемый режим работы. Это только опасно и может привести к коррупции, когда она незапланированная и неожиданная. Когда выпущенный код делает это, он знает, что делает.

Брайан Онн
источник
Да, я понимаю это. Но действительно ли сохранение 1 инструкции (саб из esp) действительно является оптимизацией? Я имею в виду сохранение нескольких байтов и 1 процессорного цикла по цене реальной возможности повреждения данных, выглядит странно. Может быть, есть другие причины для этого?
Александр Дзёба
3
Оптимизацией не является подпрограмма из esp, но, поскольку вам больше не нужно подпрограмма из esp, вы можете использовать esp в качестве базового указателя (обычно это делается ebp) и использовать ebp для чего-то еще в коде функции. Наконец, поскольку esp теперь является базовым указателем, код может избежать сохранения и восстановления ebp в прологе / эпилоге. Я уточню ответ с этой дополнительной информацией
Брайан Онн
отредактируйте и измените на rbp / rsp вместо ebp / esp, так как красная зона является только частью ABI x86-64 (хотя ничто не мешает использовать ту же технику с 32-битными регистрами; но сегодня компиляторы не делают этого так)
Брайан Онн
1
Пропуск указателя кадра вообще не связан с красной зоной - компилятор может индексировать стек, используя %rspв качестве базового указателя в любом случае.
Алецов