Где именно находится красная зона на x86-64?

От Wikipedia:

При вычислении красная зона является областью фиксированного размера в фрейме стека функций за адресом возврата, который не сохраняется этой функцией. Функция callle может использовать красную зону для хранения локальных переменных без дополнительных накладных расходов при изменении указателя стека. Эта область памяти не должна изменяться обработчиками прерываний/исключений/сигналов. Атрибут x86-64 ABI, используемый системой V, предусматривает 128-байтовую красную зону, которая начинается с после адреса возврата и включает аргументы функции. Инструментальная цепочка OpenRISC предполагает 128-байтовую красную зону.

Из System V x86-64 ABI:

128-байтная область за пределами местоположения, на которую указывает% rsp, считается зарезервированы и не должны быть изменены обработчиками сигналов или прерываний. Поэтому функции могут использовать эту область для временных данных, которые не нужны для вызовов функций. В частности, функции листьев могут использовать эту область для всего кадра стека, а не корректировать указатель стека в прологе и эпилоге. Эта область называется красной зоной.

  • С учетом этих двух котировок красная зона выше уложенного обратного адреса или ниже уложенного обратного адреса?

  • Поскольку эта красная зона относится к RSP, она перемещается вниз с каждым push и движется вверх с каждым pop?

Ответ 1

Учитывая эти два кавычки, красная зона выше уложенного обратного адреса или ниже уложенного обратного адреса?

Красная зона - это 128 байт чуть ниже rsp, то есть rsp - 128 до rsp - 1.

Поскольку эта красная зона относится к RSP, она перемещается вниз с каждым нажатием и движется ли она вверх с каждым попсом?

Да.

Ответ 2

Статья в Википедии о Красной зоне была неправильной, создавая тем самым двусмысленность.

Я изменил статью в апреле 2017 года, чтобы исправить эту проблему. Начиная с этого обновления Статья в Википедии гласит:

При вычислении красная зона представляет собой область фиксированного размера в фрейме стека функций за пределами текущего указателя стека, который не сохраняется этой функцией. Функция callle может использовать красную зону для хранения локальных переменных без дополнительных накладных расходов при изменении указателя стека. Эта область памяти не должна изменяться обработчиками прерываний/исключений/сигналов. Атрибут x86-64 ABI, используемый системой V, предусматривает 128-байтовую красную зону, , которая начинается непосредственно под текущим значением указателя стека. Инструментальная цепочка OpenRISC предполагает 128-байтовую красную зону

Это приводит статью Википедии в соответствие с определением 64-битной системы V ABI. С неопределенностью, описанной выше, в отношении вопроса:

Поскольку эта красная зона относится к RSP, она перемещается вниз с каждым нажатием и движется ли она вверх с каждым попсом?

Красная зона всегда равна 128 байтам чуть ниже RSP. По мере изменения RSP (с помощью PUSH/POP/MOV и т.д.) Так же происходит и расположение Red Zone.