如果我不在.data
或.bss
部分中映射全局变量,会发生什么。当我尝试将其映射到.bss
和.data
以外的其他部分时,它会占用一些垃圾值。
我们可以为.bss
或.data
以外的全局变量定义其他部分吗?
答案 0 :(得分:2)
在执行main()之前,会进行内存设置。
对于嵌入式环境,构建的工具(编译器,链接器等)通常会带来名为" crte" (C运行时环境),其中包含代码。也许只有你与编译器制造商签订了特殊的(昂贵的)合同,否则他们可能不会允许你提供这种见解 该代码将填写" bss" 0和"数据"具有已定义值的部分。通常这些定义的值可以在另一个名为" data.rom"的部分的非易失性存储器中找到,它只会被复制到"数据"部分。
如果您创建另一个部分,它将不会自动获得该便捷服务。并非没有特别的预防措施。结果是在上电后恰好在内存中的值。不是一个非常好的随机数生成器,但非常不可预测。这将符合您的描述"垃圾值"。
要么找出如何让crte这样做,要么自己动手 获取crte的方法可能就是链接器指令文件。它应该允许用户定义部分的配置。也许像" init0"或" init .rom"。手册当然应该为您的环境定义。
自己做(可能是商业上不太理想的方法,即风险太大,太费时间),"只是"确保在第一次访问变量之前执行了一些将值写入节的代码。链接器可能会将符号发布到编译器可见的标识符列表中,例如" __ linker_section__begin"和" __ linker_section__end"。使用它们来获取正确的内存地址。
答案 1 :(得分:0)
这取决于您的编译器,它应该是将数据标记为.bss或.data的那个,然后在您的链接描述文件中,您可能无法选择它们所在的部分,但您当然可以选择至于他们去哪里,如果你开始搞乱,你可能不得不搞乱将.data移动到ram(如果需要)和零.bss的引导程序。但同时取决于你的系统和链接器脚本,你可能不必做任何事情(比如一个基于ram的二进制文件,比如树莓派,你将.bss放在带有gnu链接器的.data之前,你也不必动。数据也不必为.bss,因为objcopy到二进制将把它放在图像中。)
您使用哪种编译器C定义的全局变量可以标记为除.bss或.data之外的其他内容?你是怎么做到的?