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了吧,只是要注意数据掉电不会丢失。

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

关于bss段的一些思考相关推荐

  1. C:谈谈内存分配中的(.data)段和(.bss)段的区别?为什么要分.data段和.bss段?

    区别: .data段: 存放已初始化的全局变量.在编译器编译的时候,会给已初始化的数据分配内存空间,数据保存在目标文件中. .bss段: (bss是英文Block Started by Symbol的 ...

  2. SECTIONS bss段初始化分析

    SECTIONS bss段初始化分析 都知道bss段需要初始化,但是这是为什么呢? 通过浏览资料,都会发现,bss段是不会出现在程序下载文件(*.bin .hex)中的,因为全都是0.如果把出现在程序 ...

  3. 链接全局变量再说BSS段的清理

    废话就不多说了,开始... 再说BSS段的清算 以前遇到一个裸机程序不能改变全局变量值的问题,最后模模糊糊处理了:手动添加了一个链接脚本,清算了BSS段.问题得以处理,就认定是BSS段清算的问题,全局 ...

  4. 关于text段、data段和bss段

    根据APUE,程序分为下面的段:.text, data (initialized), bss, stack, heap. data/bss/text: text段在内存中被映射为只读,但.data和. ...

  5. 代码段、数据段、bss段

    编译器在编译程序的时候,将程序中的所有的元素分成了一些组成部分,各部分构成一个段,所以说段是可执行程序的组成部分. 代码段:代码段就是程序中的可执行部分,直观理解代码段就是函数堆积组成的. 数据段(也 ...

  6. text段,data段,bss段,堆和栈

    红色部分为问题部分 堆和栈的区别 一.预备知识-程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等 ...

  7. (深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)(C/C++存储类型总结)(内存管理)

    文章目录 bss段 data段 text段 堆(heap) 栈(stack) 一个程序本质上都是由 bss段.data段.text段三个组成的. 存储类型总结 bss段 bss段(bss segmen ...

  8. 清除BSS段的一般做法

    link脚本一般包含类似语句: 1 2 3 4 5 6 7 8 9 10 11 _bss_start = .; __bss_start__ = .; .bss            :  {   *( ...

  9. BSS段,数据段,代码段,堆内存和栈

    BSS段,数据段,代码段,堆内存和栈 作者:delnabla 日期:2010-10-26 字体大小: 小 中 大 BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的 ...

  10. 数据段、代码段、堆栈段、BSS段的区别

    内存分配区域  32位操作系统下为:1G内核态,3G用户态 BSS段 :通常是指用来存放程序中 未初始化的全局变量.静态变量(全局变量未初始化时默认为0)的一块内存区域 数据段 :通常是指用来存放程序 ...

最新文章

  1. HTML中三维特性,前端进阶系列(三):HTML5新特性
  2. make编译工具使用
  3. Traffic Flow Forecasting: Comparison of Modeling Approaches文献阅读笔记(一)
  4. python有哪些用途-Python有哪些用途
  5. python 函数写商城管理系统
  6. 解决企业IT三大运维管理难题
  7. 研究发现,近一半生产容器存在漏洞
  8. java编程规范之java命名规范
  9. 解决Macbook安装win10/win11时遇到的WDF_Violation 蓝屏错误问题 - 安装Bootcamp驱动蓝屏
  10. 数据加密 ---- SHA 加密
  11. android 计时器 开始 停止 继续和暂停
  12. Thread-Specific Storage Pattern
  13. pyqt创建透明窗体
  14. Windows 11 上手机!小米 8、一加 6T、微软 Lumia 950 XL 都可以运行
  15. Ceph 命令 pool image 纠删
  16. 蓝桥杯---二阶魔方旋转
  17. 九年级计算机教学课时计划,【推荐】九年级下学期教学教学工作计划三篇
  18. android添加悬浮窗,在Android中使用WindowManager实现悬浮窗口
  19. Cesium聚簇实现-kdbush类实现
  20. 2022第四届长安杯检材一wp

热门文章

  1. c语言for循环26个英文字母,C语言创建链表并且插入输出26个英文字母
  2. 我被选中为TOM邮箱6.0新版体验官
  3. .Net Standard 2.1对您意味着什么
  4. 51单片机最小系统解读
  5. 陈年老调-log4j(分环境配置+动态修改)
  6. finecms存在任意文件上传漏洞复现
  7. 5位数的数字黑洞是多少_揭秘数字黑洞6174
  8. win10如何显示和隐藏文件夹
  9. U盘中毒后文件夹变成exe怎么办
  10. html5拆红包源码,最新1月拆红包源码强制分享朋友圈分享群防封裂变红包游戏