RAM中的堆栈位置几乎总是可以通过软件进行配置。在特定于工具链的链接描述文件中,将有一个名为的区域 .stack 或类似的,您可以决定放置在某个地址,或给出一定的大小。这只是内存映射部分。
.stack
在任何启动代码中完成的第一件事是设置堆栈指针。它必须通过汇编程序完成,因为C无法直接写入堆栈指针。在某些内核(如ARM)上,堆栈指针由硬件自动复位,由链接器脚本放在向量表中并在闪存中编程的值自动设置。
一般来说,硅供应商几乎总是将这完全留给程序员来决定。核心确实指定是否存在向上计数或向下计数堆栈。到目前为止最常见的是向下计数,但是一些奇怪的架构具有向上计数的堆栈(最着名的是PIC)。
至于堆栈指针的设置位置,如果此类代码随工具链一起提供,您可以在启动代码(“CRT”)中尽早找到它。通常它采用从链接器脚本获得的值,但如果您愿意,也可以对其进行硬编码。它需要在执行任何C代码之前完成,因为C喜欢使用堆栈。
如果您自己编写所有内容,则应该从重置向量内部向堆栈指针写入重置之外的第一件事。
每个架构都是这样做的。 ARM Cortex uCs将初始堆栈指针位置存储为向量表中的前32位值。引导uC时,硬件会加载该值。所以这个地址完全可以由程序员控制。
然后启动例程可以更改它或设置双栈(一个用于特权模式的另一个线程)。