Расположение стека в ОЗУ почти всегда настраивается с помощью программного обеспечения.В вашем скрипте компоновщика для цепочки инструментов будет область с именем .stack
или аналогичная, которую вы можете разместить по определенному адресу или задать определенный размер.Это только часть отображения памяти.
Первое, что нужно сделать в любом коде запуска, - установить указатель стека.Это должно быть сделано через ассемблер, так как C не имеет средств для прямой записи в указатель стека.На некоторых ядрах, таких как ARM, указатель стека автоматически устанавливается аппаратно после сброса, исходя из значения, которое ваш скрипт компоновщика поместил в таблицу векторов и запрограммировал во флэш-памяти.
Таким образом, обычно поставщик кремния почти всегдаоставляет это полностью на усмотрение программиста.Однако ядро определяет, есть ли стек с повышением или понижением.Самым распространенным на сегодняшний день является обратный отсчет, но в некоторых архитектурах странных персонажей есть стеки с повышающим счетом (наиболее известный PIC).
Что касается того, где установлен указатель стека, вы найдете его очень рано встартовый код («CRT»), если такой код поставляется с вашей цепочкой инструментов.Как правило, он принимает значение, полученное из скрипта компоновщика, но вы также можете жестко его кодировать, если хотите.Это должно быть сделано до того, как будет выполнен любой код C, поскольку C любит использовать стек.
Если вы пишете все самостоятельно, вы должны записать в указатель стека первое, что вы делаете из сброса, извнутри вектора сброса.