Где именно красная зона на x86-64?
Из Википедии:
В вычислениях красная зона - это область фиксированного размера в кадре стека функции за пределами адреса возврата, который не сохраняется этой функцией. Функция вызываемого может использовать красную зону для хранения локальных переменных без дополнительных затрат на изменение указателя стека. Эта область памяти не должна изменяться обработчиками прерываний / исключений / сигналов. ABI x86-64, используемый System V, предписывает 128-байтовую красную зону, которая начинается непосредственно после адреса возврата и включает аргументы функции. Цепочка инструментов OpenRISC предполагает 128-байтную красную зону.
128-байтовая область за пределами местоположения, на которое указывает% rsp, считается зарезервированной и не должна изменяться обработчиками сигналов или прерываний. Поэтому функции могут использовать эту область для временных данных, которые не нужны при вызовах функций. В частности, листовые функции могут использовать эту область для всего кадра стека, вместо того, чтобы корректировать указатель стека в прологе и эпилоге. Эта область известна как красная зона.
Учитывая эти две кавычки, находится ли красная зона над сложенным обратным адресом или под сложенным обратным адресом?
Так как эта красная зона относительно
RSP
движется ли вниз с каждымpush
и движется ли он вверх с каждымpop
?
2 ответа
Учитывая эти две кавычки, находится ли красная зона над сложенным обратным адресом или под сложенным обратным адресом?
Красная зона - 128 байтов чуть ниже rsp
т.е. rsp - 128
в rsp - 1
,
Так как эта красная зона относительно RSP, она движется вниз с каждым толчком и движется вверх с каждым треском?
Да.
Статья в Википедии о Красной Зоне была неверной, что создавало двусмысленность.
Я изменил статью в апреле 2017 года, чтобы исправить проблему. На момент этого обновления статья в Википедии гласит:
В вычислениях красная зона - это область фиксированного размера в кадре стека функции за пределами текущего указателя стека, который не сохраняется этой функцией. Функция вызываемого может использовать красную зону для хранения локальных переменных без дополнительных затрат на изменение указателя стека. Эта область памяти не должна изменяться обработчиками прерываний / исключений / сигналов. ABI x86-64, используемый System V, предписывает 128-байтовую красную зону, которая начинается непосредственно под текущим значением указателя стека. Набор инструментов OpenRISC предполагает 128-байтную красную зону
Это приводит статью Википедии в соответствие с 64-битным определением System V ABI. С неопределенностью, решенной выше, относительно вопроса:
Так как эта красная зона относительно RSP, она движется вниз с каждым толчком и движется вверх с каждым треском?
Красная Зона всегда 128 байтов чуть ниже RSP. При изменении RSP (по PUSH/POP/MOV и т. Д.) Меняется и расположение красной зоны.