Ответ 1
Во-первых, это зависит от платформы. В некоторых архитектурах стек выделяется из нижней части адресного пространства и растет вверх.
Предполагая, что архитектура, подобная x86, которая стекала вверх из верхней части адресного пространства, идея довольно проста:
=============== Highest Address (e.g. 0xFFFF)
| |
| STACK |
| |
|-------------| <- Stack Pointer (e.g. 0xEEEE)
| |
. ... .
| |
|-------------| <- Heap Pointer (e.g. 0x2222)
| |
| HEAP |
| |
=============== Lowest Address (e.g. 0x0000)
Чтобы увеличить стек, вы уменьшите указатель стека:
=============== Highest Address (e.g. 0xFFFF)
| |
| STACK |
| |
|.............| <- Old Stack Pointer (e.g. 0xEEEE)
| |
| Newly |
| allocated |
|-------------| <- New Stack Pointer (e.g. 0xAAAA)
. ... .
| |
|-------------| <- Heap Pointer (e.g. 0x2222)
| |
| HEAP |
| |
=============== Lowest Address (e.g. 0x0000)
Как вы можете видеть, чтобы увеличить стек, мы уменьшили указатель стека от 0xEEEE до 0xAAAA, тогда как для увеличения кучи вам нужно увеличить указатель кучи.
Очевидно, что это упрощение макета памяти. Фактический исполняемый файл, раздел данных... также загружается в память. Кроме того, потоки имеют собственное пространство стека.
Вы можете спросить, почему стек должен расти вниз. Ну, как я уже говорил, некоторые архитектуры делают наоборот, заставляя кучу расти вниз, и стек растет вверх. Имеет смысл ставить стек и кучу на противоположных сторонах, поскольку он предотвращает перекрытие и позволяет обеим областям расти свободно, если у вас достаточно доступного адресного пространства.
Еще один правильный вопрос: Может ли программа не уменьшать/увеличивать указатель стека? Как архитектура может накладывать одну на другую программисту? Почему это не так зависит от программы, поскольку она зависит от архитектуры?
Хотя вы можете в значительной степени бороться с архитектурой и каким-то образом уйти со своего стека в противоположном направлении, некоторые инструкции, особенно call
и ret
, которые изменяют указатель стека непосредственно, будут предполагать другое направление, создавая беспорядок.