тролль - это не только ценный жир, но и 3-4 легкоусвояемых коммента ежедневно
Господа, поясните пожалуйста, зачем нужна эта красная зона в стеке?
Что этим пытаются выиграть? И выигрывают ли что-нибудь?
Чем это лучше, чем старый добрый способ (sub ESP,nnnn в вызванной функции)?
Что этим пытаются выиграть? И выигрывают ли что-нибудь?
Чем это лучше, чем старый добрый способ (sub ESP,nnnn в вызванной функции)?
Зато благодаря этим поискам открыл для себя архитектуру PowerPC. Я до сих пор жил счастливо и не знал, что такое безобразие существует в природе!
В толстенном описании этой процессорной архитектуры слово "стек" не встречается вообще! Инструкции вызова подпрограмм и не подозревают о существовании стека! При вызове подпрограммы адрес возврата заносится в спец. регистр, а сохранять его из этого спец.регистра куда-нибудь в память - забота программиста. Нету команд PUSH/POP. Автоинкремент/автодекремент указателя при сохранении данных в память не поддерживается аппаратно. Такое впечатление, что стек - это чисто софтовая заморочка, которой может и не быть. Будет у программиста 0 стеков, 1 стек или 30 стеков одновременно - процессору всё равно: хочешь стек - бери любой регистр (их там 32) и используй его как указатель стека ))) Но удобных PUSH/POP всё равно не будет.
Наверное, именно с этой архитектуры и пошло это странное требование: делать кадры стека большими и создавать в них место про запас, чтобы вызываемые функции не строили свой кадр стека, а использовали зарезервированное для них место в кадре стека вызвавшей их функции.
Вот тут (стр 17) написана интересная деталь про создание кадра стека: нужно атомарной(!) операцией записать в начало нового кадра стека адрес предыдущего кадра и одновременно записать в указатель стека адрес нового кадра. Для сравнения: x86 такого атомарно делать не умеет!
А вот тут написано, как люди мучаются, перенося идеологию "красной зоны" на x86.
на большинстве процессорных архитектур понятие "вызов обработчика (сигнала,прерывания,...)" означает неизбежное затирание нескольких байт ниже ESP прерываемого процесса
Поэтому при вызове сингала esp смещается на размер красной зоны вниз и вызывается обработчик сигнала.
как происходит это смещение ESP вниз? аппаратно или программно?
требование этой красной зоны означает гарантию сохранности данных НИЖЕ ESP!!! на каких архитектурах такое вообще возможно?
А в чём проблема? Это сделано специально для того, чтобы функция могла не делать sub esp, xxx, если размер её фрейма небольшой и она не вызывает других функций. Она в этом случае будет работать со адресами, которые меньше значения esp.
как происходит это смещение ESP вниз? аппаратно или программно?
Программно. Аппаратная часть не умеет соблюдать красную зону.
Ах да, если не ошибаюсь, прерывание обычно приводит к записи данных в стек ядра, а не в стек пользователя.
Если прерывание выполняется в своём стеке, то ему абсолютно фиолетово на какую-то там красную зону в стеке пользователя.
А если прерывание выполняется на стеке прерываемой программы - то я не понимаю, как она может соблюсти эту красную зону. Прежде чем обработчик прерывания получит управление, в стек уже что-то понапихается )))