.bss部分如何复制到RAM?

时间:2016-10-28 17:34:17

标签: c linker gnu ld linker-scripts

我是嵌入式系统低级编程的新手,我很困惑在链接器生成输出目标文件和闪存.bin文件之后发生的事情。

1-我在链接描述文件中看到.bss部分的可加载内存地址(LMA)和虚拟内存地址(VMA)在RAM中,我的问题是它是如何最初进入RAM的,因为我在闪存中闪存我的二进制图像?

2-我看到的启动代码只将RAM中的.bss部分清零,但是如果启动代码没有将其复制到RAM,它是如何实现的,就像它使用.data一样部分 ?

1 个答案:

答案 0 :(得分:0)

评论者看起来很大程度上回答了你的问题,但是将这一点放在未来可能会遇到问题的人们身上:

您在这里看到的是优化。根据定义* .bss部分都是0' s。虽然你可以写一大堆零到闪存,然后在启动时将大量的零复制到ram,为什么要这么麻烦?所有你真正需要知道的是"搬迁" 0的数组需要结束。链接器文件通常会定义名为_sbss_ebss(通常也称为_szero_ezero)的符号。现在,整个.bss部分只占用闪存中的两个内存字(_sbss_ebss符号)。您的启动例程(在main()之前运行的代码,与复制其他数据的代码相同)可以执行类似memset(_sbss, 0, _ebss-_sbss)的操作,并且.bss部分已设置并准备就绪。

*在您和大多数现代环境中.bss被定义为全零。