C语言 如何.bss节复制到RAM



我是嵌入式系统低级编程的新手,我很困惑在链接器生成输出对象文件和闪烁.bin文件期间究竟发生了什么。

1-我在链接器脚本中看到。bss节的可加载内存地址(LMA)和虚拟内存地址(VMA)在RAM中,我的问题是它最初是如何进入RAM的,因为我在flash内存中闪烁二进制映像?

2-启动代码我只看到零。bss部分在RAM中,但它是如何到达那里,如果启动代码没有复制到RAM,因为它与。data部分?

看起来评论者基本上回答了你的问题,但是把这个放在这里是为了将来可能遇到这个问题的人:

你在这里看到的是一个优化。根据定义,.bss部分*都是0。虽然您可以将一个大的零数组写入闪存,然后在引导时将大的零数组复制到ram中,但为什么要这么做呢?您真正需要知道的是"重新定位"的0数组需要在哪里结束。链接器文件通常会定义命名为_sbss_ebss之类的符号(也通常被视为_szero_ezero)。现在,整个.bss部分在闪存中只占用两个单词的内存(_sbss_ebss符号)。您的启动例程(在main()之前运行的代码,与复制其他数据的代码相同)可以执行memset(_sbss, 0, _ebss-_sbss).bss部分的操作。

*在大多数现代环境中,.bss被定义为全0

最新更新