我是嵌入式系统低级编程的新手,我很困惑在链接器生成输出目标文件和闪存.bin文件之后发生的事情。
1-我在链接描述文件中看到.bss部分的可加载内存地址(LMA)和虚拟内存地址(VMA)在RAM中,我的问题是它是如何最初进入RAM的,因为我在闪存中闪存我的二进制图像?
2-我看到的启动代码只将RAM中的.bss部分清零,但是如果启动代码没有将其复制到RAM,它是如何实现的,就像它使用.data一样部分 ?
答案 0 :(得分:0)
评论者看起来很大程度上回答了你的问题,但是将这一点放在未来可能会遇到问题的人们身上:
您在这里看到的是优化。根据定义* .bss
部分都是0' s。虽然你可以写一大堆零到闪存,然后在启动时将大量的零复制到ram,为什么要这么麻烦?所有你真正需要知道的是"搬迁" 0的数组需要结束。链接器文件通常会定义名为_sbss
和_ebss
(通常也称为_szero
和_ezero
)的符号。现在,整个.bss
部分只占用闪存中的两个内存字(_sbss
和_ebss
符号)。您的启动例程(在main()
之前运行的代码,与复制其他数据的代码相同)可以执行类似memset(_sbss, 0, _ebss-_sbss)
的操作,并且.bss
部分已设置并准备就绪。
*在您和大多数现代环境中.bss
被定义为全零。