Я знаю, что в архитектурах, с которыми я лично знаком (x86, 6502 и т.д.), стек обычно растет вниз (т.е. каждый элемент, помещенный в стек, приводит к уменьшению SP, а не к увеличению).
Мне интересно историческое обоснование этого. Я знаю, что в унифицированном адресном пространстве удобно начинать стек на противоположном конце сегмента данных (скажем), поэтому проблема возникает только в том случае, если две стороны сталкиваются посередине. Но почему стек традиционно получает верхнюю часть? Особенно с учетом того, насколько это противоположность «концептуальной» модели?
(И обратите внимание, что в архитектуре 6502 стек также растет вниз, даже если он ограничен одной 256-байтовой страницей, и этот выбор направления кажется произвольным.)
источник
Одно хорошее объяснение, которое я слышал, заключалось в том, что в прошлом некоторые машины могли иметь только беззнаковые смещения, поэтому вам нужно, чтобы стек рос вниз, чтобы вы могли поразить своих локальных переменных, не теряя дополнительную инструкцию для имитации отрицательного смещения.
источник
Стэнли Мазор (архитектор 4004 и 8080) объясняет, как было выбрано направление роста стека для 8080 (и, в конечном итоге, для 8086) в статье «Микропроцессоры Intel: от 8008 до 8086» :
источник
Одна из возможных причин может заключаться в том, что это упрощает выравнивание. Если вы поместите в стек локальную переменную, которая должна быть размещена на 4-байтовой границе, вы можете просто вычесть размер объекта из указателя стека, а затем обнулить два младших бита, чтобы получить правильно выровненный адрес. Если стек растет вверх, обеспечение выравнивания становится немного сложнее.
источник
A - B
концептуально может быть реализовано какA + (-B)
(т. Е. Как отдельный шаг отрицания дляB
), на практике это не так.IIRC стек растет вниз, потому что куча растет вверх. Все могло быть наоборот.
источник
realloc(3)
нужно больше места после объекта, чтобы просто расширить отображение без копирования. Повторное перераспределение одного и того же объекта возможно, если за ним следует произвольное количество неиспользуемого пространства.Я считаю, что это чисто дизайнерское решение. Не все из них растут вниз - см. Эту ветку SO, где подробно обсуждается направление роста стека на разных архитектурах.
источник
Я считаю, что соглашение началось с IBM 704 и его печально известного «регистра декремента». В современной речи это поле смещения инструкции, но дело в том, что они пошли вниз , а не вверх .
источник
Еще 2с:
Помимо всех упомянутых исторических причин, я совершенно уверен, что для современных процессоров нет никаких оснований. Все процессоры могут принимать смещения со знаком, и максимизация расстояния кучи / стека довольно спорна с тех пор, как мы начали иметь дело с несколькими потоками.
Я лично считаю это недостатком системы безопасности. Если бы, скажем, разработчики архитектуры x64 изменили направление роста стека на противоположное, большинство переполнений буфера стека было бы устранено, что в некотором роде имеет большое значение. (поскольку струны растут вверх).
источник
Я не уверен, но в свое время я занимался программированием для VAX / VMS. Кажется, я помню, как одна часть памяти (куча ??) поднималась вверх, а стек опускался. Когда эти двое встретились, вы были вне памяти.
источник
Одним из преимуществ нисходящего роста стека в минимальной встроенной системе является то, что один фрагмент ОЗУ может быть избыточно отображен как на страницу O, так и на страницу 1, что позволяет назначать нулевые переменные страницы, начиная с 0x000, а стек растет вниз от 0x1FF, максимально увеличивая количество, которое оно должно было бы увеличиться перед перезаписью переменных.
Одна из первоначальных целей дизайна 6502 заключалась в том, чтобы его можно было объединить, например, с 6530, в результате чего получилась двухчиповая микроконтроллерная система с 1 КБ программной ПЗУ, таймером, вводом-выводом и 64 байтами общей оперативной памяти между переменными стека и нулевой страницы. Для сравнения, минимальная встраиваемая система того времени на базе 8080 или 6800 состояла бы из четырех или пяти микросхем.
источник