Это связано с вопросом, 'Почему стеки обычно растут вниз?', но больше с точки зрения безопасности. Я обычно обращаюсь к x86.
Это кажется мне нечетный, который стек вырастил бы вниз, когда буферы обычно пишутся во вверх в памяти. Например, типичная строка C++ имеет свой конец в более высоком адресе памяти, чем начало.
Это означает, если существует переполнение буфера, перезапись далее стека вызовов который я понимаю, угроза безопасности, так как это открывает возможность изменения содержание локальной переменной и обратные адреса.
Если бы стек вырос вверх в памяти, то переполнение буфера просто не работало бы в к мертвой памяти? Это улучшило бы безопасность? Если так, почему это не было сделано? Что относительно x64 те стеки растут вверх и если не почему нет?
Технически это зависит от ОС / ЦП, но обычно это происходит потому, что стек и куча растут в противоположных направлениях и с противоположных концов адресного пространства.
Такое расположение дает вам максимальную гибкость при разделении / распределении памяти между кучей и стеком, не вызывая их конфликтов. Если бы они оба росли в одном направлении, вам бы потребовался начальный адрес стека, который бы жестко ограничивал максимальный размер кучи (и жестко ограничивал размер стека)
ETA:
Нашел интересную статью в википедии о том, почему увеличение стека вверх не обязательно предотвращает переполнение стека - это просто заставляет их работать немного по-другому.
Вероятно, потому что архитектура большинства процессоров была разработана в то время, когда мужчины были мужчинами, и вы могли быть уверены, что ваши программисты не захотят воровать номера кредитных карт людей. ... сейчас уже слишком поздно что-то менять (хотя, как вы говорите, это, вероятно, можно было бы сделать для новых архитектур, таких как Itanium , который на самом деле имеет два стека !)
{{ 1}}Ну, я не знаю, будет ли направление роста стека сильно влиять на безопасность, но если вы посмотрите на архитектуру машины, то рост стека в направлении отрицательного адреса действительно упрощает соглашения о вызовах, указатели на кадр стека, распределение локальных переменных и т.д. и т.п.
В архитектуре 8088 (начало семейства x86) использовался стек, растущий вниз, и для совместимости он так и остался с тех пор. В те времена (начало 80-х) уязвимости переполнения буфера на домашних компьютерах были далеко за пределами радара.
Я не могу сказать, почему они решили, что стек будет расти вниз, хотя интуитивно кажется, что он должен расти вверх. Однако, как уже упоминалось, память часто делилась на стек и кучу; возможно, разработчик процессора решил, что важно, чтобы куча росла, и поэтому стек стал расти вниз.