天天看点

关于bss段的一些思考

bss段是用来存放:

未初始化的全局变量

未初始化的静态局部变量

初始化为0的全局变量(部分编译器会将它放到data段)

初始化为0的静态局部变量(部分编译器会将它放到data段)

bss段在elf格式的可执行文件中是不占用空间的,只会记录它的大小等一些标记性数据,具体细节不讨论。
操作系统下的应用程序需要在main函数执行前先执行一段引导代码,这段代码中包含了清零bss段等准备工作,这里具体细节不是很清楚,猜测部分是由操作系统完成,部分是编译器提供的代码在链接时加入到程序中。
在没有操作系统的嵌入式裸机程序中,程序在运行阶段代码和数据都在内存(SRAM或DRAM)中。我们需要的是bin(格式转换工具负责将elf转换成bin格式)文件,也就是镜像文件,该文件是真正可以被拷贝到内存(SRAM和DRAM)中并被cpu直接识别运行的。在bin文件中,bss段需要占用空间吗,答案本来应该是肯定的,但这里有一点需要注意,当连接脚本中将bss段作为最后一个段时,我们会发现它不会占用bin文件的大小;如果bss段不是最后一个段时,他就会占用bin文件大小并且将这部分写为零。这里对于不同的格式转换工具可能不同。另外因为没有了操作系统帮我们完成清零bss段,所以这需要我们自己完成

对于单片机这种东西就比较特殊,它是在NorFlash里运行但是变量在SRAM中,这时代码和部分数据在Flash中,部分数据在内存中,有时将程序直接下载到SRAM中运行时代码和数据都在内存中。同样需要清理bss段,这部分代码已经在库提供的.s文件中被调用完成不需要我们干涉只需要正确配置IDE中的值即可。这种情况下bss段会占用bin文件大小吗,bss段如果不是最后一个段呢,按理说单片机这种情况最好是NorFlash中的bss段这部分不占空间最好,因为占了根本没用,它只在SRAM中才有用;不占的话在程序运行前期将变量数据部署到SRAM中时一些东西就不太好处理,例如bss段不是最后一个段时就不知道要在SRAM中分配多大空间给bss段这部分数据,而且有时我们可能会将程序直接下载到SRAM中运行,总之这里需要考的东西还挺多,具体怎么实现的就没去深入研究了。

之所以需要SRAM是因为Norflash读写速度较慢(当然这里不能一概而论,因为实际的系统中包含有指令缓冲和数据缓冲等,并且对代码进行优化的话有时Norflash的读速度还会更加快一点,但是写入速度Norflash就差了很多)并且多次擦写会损坏,排除这两点我想可能就不需要SRAM了吧,只是要注意数据掉电不会丢失。

以上内容是我自己在学习时的一些思考和理解,因为能力有限,部分猜测和结论可能不准确,如有不对的地方或者更深入的解释还请给予补充和指正。

继续阅读