bootrom romcode中的可读写段

问题

芯片通常会有一段rom flash映射到cpu的0地址,当芯片复位时,直接运行rom flash的代码,既然是rom flash,那么肯定不能往flash写数据。但是我们代码里难免会用到堆和栈,以及一些全局可读写变量,那这些内容该放到哪里呢,在什么时候放的?

放到哪里

  1. 堆栈:可以分配一块sram空间,设置堆和栈指向这块区域
  2. 全局变量:同样是把rom flash中的可读写段搬移到sram中
  3. bss:放到全局变量后面的sram

什么时候放

在最初的启动汇编中,就要执行把这些堆栈、bss、全局变量准备好,然后才能跳转到c函数中

从哪里搬到哪里

可能我们还会有一个疑问,启动汇编怎么知道rom flash的哪些段要搬到sram中?
那这就要看看arm的链接规范了。

ARM Compiler toolchain Linker

这份文档讲了以下内容

  1. 链接命令及使用
  2. 镜像结构
  3. 链接符号
  4. scatter文件使用

下面这张图说明了rom flash分为ro段和rw段,rw段需要再rom startup阶段copy到ram中。

arm链接器为image中的每个段生成以下类型相关符号,需要通过特殊指令来使load和image地址相同,否则它俩是不一致的。

  • image$$ :代表图中execution的地址
  • Load$$:代表图中load的地址

Reference

https://developer.arm.com/documentation/dui0474/latest/

posted @ 2022-09-22 16:20  zephyr~  阅读(123)  评论(0编辑  收藏  举报