Описание тега red-zone

Красная зона - это пространство стека, защищенное от асинхронной модификации, даже если оно не зарезервировано обычным способом. Некоторые ABI (особенно x86-64 SysV ABI) предоставляют его.
0 ответов

Подозрительное использование области памяти указателя ниже стека для локальных переменных

Недавно я обнаружил неясный факт о резервировании памяти для локальных переменных в сгенерированном коде g++: переменные размещаются по адресам под указателем стека. Например, когда эта программа (main.cpp) скомпилирована: void __attribute__ ((noinl…
24 авг '17 в 11:07
2 ответа

Некорректное красное зонирование стека при генерации кода x86-64

Это вывод компилятора из функции ядра Linux (скомпилированный с -mno-red-zone): load_balance: .LFB2408: .loc 2 6487 0 .cfi_startproc .LVL1355: pushq %rbp # .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp #, .cfi_def_cfa_register 6 pushq %r…
29 июл '14 в 21:14
0 ответов

Почему в x64 функции epilog нет инструкции `отпуска`?

Я собираюсь понять, как работает стек на компьютерах с архитектурой x86 и x64. Однако я заметил, что когда я вручную пишу код и разбираю его, он отличается от того, что я вижу в коде, который предоставляют люди (например, в своих вопросах и руководс…
20 фев '19 в 08:15
2 ответа

Почему в этом прологе функции нет инструкции "sub rsp" и почему параметры функции хранятся с отрицательным смещением rbp?

Вот что я понял, прочитав некоторые документы по сегментации памяти: когда вызывается функция, есть несколько инструкций (называемых прологом функции), которые сохраняют указатель кадра в стеке, копируют значение указателя стека в базовый указатель …
24 фев '15 в 10:53
1 ответ

Недопустимый доступ к красной зоне стека при объединении сложного объекта

Я использую игру! Framework 1.2.4 для проекта, который передает объекты из внешнего контекста (собственно Flex) в сервис. Шлюз использует платформу Cinnamon (http://www.spicefactory.org/pimento/) для обработки запросов AMF, которые должны быть напра…
15 фев '12 в 22:05
2 ответа

Grails: неверный доступ к красной зоне стека

Я использую приложение Grails 2.0.4 на OS X (10.7.4). Приложение запускается без проблем, но когда я пытаюсь получить доступ к домашней странице в браузере, я получаю ошибки красной зоны стека: Invalid access of stack red zone 0x1139b10c0 rip=0x112e…
17 июл '12 в 22:26
2 ответа

Почему компилятор резервирует немного стекового пространства, но не весь размер массива?

Следующий код int main() { int arr[120]; return arr[0]; } Компилируется в это: sub rsp, 360 mov eax, DWORD PTR [rsp-480] add rsp, 360 ret Зная, что целые числа составляют 4 байта, а размер массива - 120, массив должен занимать 480 байтов, но из ESP …
25 июл '18 в 15:52
0 ответов

Сборка: я не понимаю, почему указатель стека кажется (!) резервировать здесь недостаточно памяти

Я новичок в сборке, поэтому ответ на мой вопрос вполне очевиден для большинства из вас, но не для меня. Пожалуйста, не вините. На 64-битной системе этот C-код: 1| int main () 2| { 3| char ary[230]; 4| ary[0] = 2; 5| return 0; 6| } Результаты в этом …
03 фев '19 в 15:12
2 ответа

Почему GCC вычитает неправильное значение указателю стека при выделении большого массива без последующих вызовов функций?

Действительно странная причудливость GCC. Проверь это: main() { int a[100]; a[0]=1; } производит эту сборку: 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: 48 81 ec 18 01 00 00 sub $0x118,%rsp b: c7 85 70 fe ff ff 01 movl $0x1,-0x190(%rbp) 12: 00 00 0…
01 дек '11 в 07:18
4 ответа

Почему код ядра не может использовать красную зону

Настоятельно рекомендуется при создании 64-разрядного ядра (для платформы x86_64) указывать компилятору не использовать 128-байтовую красную зону, как это делает пользовательский интерфейс ABI. (Для GCC флаг компилятора -mno-red-zone). Ядро не будет…
20 авг '14 в 13:36
4 ответа

Неверный доступ к красной зоне стека из Java VM

Я пытаюсь выяснить, что может вызвать эту ошибку в Java: Invalid access of stack red zone 0x115ee0ed0 rip=0x114973900 Кто-нибудь когда-нибудь сталкивался с этим сообщением об ошибке? Это буквально убивает JVM, и все на этом останавливается. В настоя…
01 окт '09 в 03:35
2 ответа

Использование регистра базового указателя в C++ inline asm

Я хочу иметь возможность использовать регистр указателя базы (%rbpв пределах встроенного ассм. Игрушечный пример этого выглядит так: void Foo(int &x) { asm volatile ("pushq %%rbp;" // 'prologue' "movq %%rsp, %%rbp;" // 'prologue' "subq $12, %%rs…
29 дек '15 в 22:20
2 ответа

Зачем нам нужно выделение стека, когда у нас красная зона?

У меня есть следующие сомнения: Как мы знаем, System V x86-64 ABI дает нам область фиксированного размера (128 байт) в кадре стека, так называемую красную зону. Таким образом, в результате нам не нужно использовать, например, sub rsp, 12, Просто сде…
21 июн '16 в 10:20
5 ответов

Встроенная сборка, перекрывающая красную зону

Я пишу криптографическую программу, а ядро ​​(широко распространенная процедура) написано на сборке x86-64, как для скорости, так и потому, что в ней широко используются такие инструкции, как adc которые не легко доступны из C. Я не хочу вставлять э…
17 июн '11 в 03:20
1 ответ

RSP не двигается при входе в новую функцию

При входе в функцию C я ожидал увидеть в разборке, как указатель стека вычитается достаточно, чтобы освободить место для переменных, но нет; Я только вижу, как адрес переменных напрямую доступен через ebp, когда esp все еще указывает на ebp. push %r…
04 ноя '17 в 15:14
1 ответ

Настройка локального стека в соответствии с соглашением о вызовах x86-64 в Linux

Я делаю некоторую расширенную оптимизацию сборки на коде gnu C, работающем на 64-битной Linux. Я хотел напечатать отладочные сообщения из кода сборки, и вот как я наткнулся на следующее. Я надеюсь, что кто-то может объяснить, что я должен делать в э…
08 дек '14 в 15:44
2 ответа

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

Из Википедии: В вычислениях красная зона - это область фиксированного размера в кадре стека функции за пределами адреса возврата, который не сохраняется этой функцией. Функция вызываемого может использовать красную зону для хранения локальных переме…
26 июн '16 в 19:07
1 ответ

Отсутствие выделения стека в 64-битной системе при работе над статьей Aleph One

Я испортил "Smash the Stack для удовольствия и прибыли" от Aleph One и обнаружил, что при компиляции кода для моего 64-разрядного процессора стековая память не выделяется с использованием обычного "sub $VALUE, %REG ". Это исходный код функции: void …
09 окт '16 в 08:51
2 ответа

Зачем сохранять пространство стека для локальных переменных?

Я новичок в языке ассемблера, и мне было интересно узнать о локальных переменных: почему мы (или компиляторы) сохраняем для них место в стеке, обычно уменьшая регистр "ESP" в прологе процедуры и по окончании процедуры мы присваиваем "ESP" его старое…
0 ответов

Сборка странное использование стека

У меня есть несколько вопросов о том, как стек используется в сборке. Насколько я знаю, регистр% rsp используется в качестве указателя стека. Чтобы выделить новую память для стека в коде ассемблера, вы просто вычитаете необходимое количество из% rsp…
17 мар '19 в 14:05