一般情况,一个程序本质上都是由 bss段、data段、text段三个段组成——这是计算机程序设计中重要的基本概念。而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的问题。

在采用段式内存管理的架构中(比如intel的80x86系统),bss段(Block Started by Symbol segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时bss 段部分将会清零(bss段属于静态内存分配,即程序一开始就将其清零了)。

比如,在C语言程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中。

text段: 用于存放程序代码的区域, 编译时确定, 只读。更进一步讲是存放处理器的机器指令,当各个源文件单独编译之后生成目标文件,经连接器链接各个目标文件并解决各个源文件之间函数的引用,与此同时,还得将所有目标文件中的.text段合在一起,但不是简单的将它们“堆”在一起就完事,还需要处理各个段之间的函数引用问题。

在嵌入式系统中,如果处理器是带MMU(MemoryManagement Unit,内存管理单元),那么当我们的可执行程序被加载到内存以后,通常都会将.text段所在的内存空间设置为只读,以保护.text中的代码不会被意外的改写(比如在程序出错时)。当然,如果没有MMU就无法获得这种代码保护功能。

data段 :用于存放在编译阶段(而非运行时)就能确定的数据,可读可写。也是通常所说的静态存储区,赋了初值的全局变量、常量和静态变量都存放在这个域。

而bss段不在可执行文件中,由系统初始化。

关于data和bss段更详细的区别我们不妨用下面2段小程序说明一下

程序1:

int ar[30000];

void main()

{

......

}

程序2:

int ar[300000] =  {1, 2, 3, 4, 5, 6 };

void main()

{

......

}

发现程序2编译之后所得的可执行文件比程序1大得多。

为什么?

区别很明显,程序1位于bss段,程序2位于data段,两者的区别在于:

全局的未初始化变量存在于bss段中,具体体现为一个占位符,全局的已初始化变量存于data段中,而函数内的自动变量都在栈上分配空间。

bss不占用可执行文件空间,其内容由操作系统初始化(清零),裸机程序需要自行手动清零。

而data段则需要占用可执行文件空间,其内容由程序初始化,因此造成了上述情况。

注意

bss段(未手动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的大小。

data段(已手动初始化的数据)为数据分配空间,数据保存在目标文件中。

data段包含经过初始化的全局变量以及它们的值。

BSS段的大小从可执行文件中得到,然后链接器得到这个大小的内存块,紧跟在数据段后面。当这个内存区进入程序的地址空间后全部清零,包含data和bss段的整个区段此时通常称为数据区。

浅谈text段、data段和bss段相关推荐

  1. 浅谈CSS首字放大下沉及段首缩进2字符

    1.CSS首字放大下沉 对首字进行放大下沉,需用到css的伪元素:first-letter. <!doctype html> <html><head><sty ...

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

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

  3. C.2#【数据段】—2.数据段data、bss、rodata

    1.1 data 段 用来存储已经初始化的全局变量,也属于静态内存分配区,会占用程序文件空间. 与bss相比,data就容易明白多了,它的名字就暗示着里面存放着数据.当然,如果数据全是零,为了优化考虑 ...

  4. bss段和data段的区别

    一.bss与data 一般情况下,一个程序本质上都是由 bss段.data段.text段三个组成的--本概念是当前的计算机程序设计中是很重要的一个基本概念.而且在嵌入式系统的设计中也非常重要,牵涉到嵌 ...

  5. ELF中的.data段和.bss段

    .data 段: 已初始化的全局变量和局部静态变量都保存在 .data 段. .bss 段: 未初始化的全局变量和局部静态变量默认值都为 0,本来它们也可以被放在 .data 段的,但是因为它们都是 ...

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

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

  7. BSS段、数据段、代码段、堆与栈

    BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 ...

  8. 代码段+数据段+bss段+stack+heap

    在学习之前我们先看看ELF文件. ELF分为三种类型:.o 可重定位文件(relocalble file),可执行文件以及共享库(shared library),三种格式基本上从结构上是一样的,只是具 ...

  9. C++ 堆区,栈区,数据段,bss段,代码区(详解)

    各段的介绍 一般情况下,一个可执行C程序在内存中主要包含5个区域,分别是代码段(text),数据段(data),BSS段,堆段(heap)和栈段(stack).其中前三个段(text,data,bss ...

最新文章

  1. view5.3登录桌面提示当前可用桌面资源不足
  2. 手把手教你使用深度学习的方法进行人脸解锁
  3. VMware CTO:未来VMware NSX与思科ACI将有更多整合
  4. 一个恶心的无法同步服务器与pda时间的龌龊问题
  5. spring 配置多数据源
  6. 前端学习(2440):axios处理文章数据
  7. sharepoint webpart
  8. 5G关键技术研究方向
  9. CSS3新属性:在网站中使用访客电脑里没有安装的字体
  10. 华为将发布“鸿蒙”以取代 Android 系统
  11. infortrend ESDS RAID6故障后的数据恢复方案
  12. 6个html5手机游戏源码,html5逗你玩手机游戏源码
  13. html表单鼠标悬停变色,当我将鼠标悬停在html表格中时,更改单元格中颜色的颜色...
  14. 电商系统购物车流程图
  15. 阿里月饼事件被辞程序员冤吗
  16. Error: ENOENT: no such file or directory, scandir .....
  17. 结构方程模型amos中介效应与调节效应
  18. 求求你了!别瞎提交代码了,看人家 Git 提交规范那叫一个舒服!
  19. cnblogs!I'm comeing!
  20. Day2--正则表达式

热门文章

  1. 地铁出行规划项目分析
  2. pyhton爬取爱豆(李易峰)微博评论
  3. wx-sideslip:类似 QQ 通讯录侧滑
  4. 涪陵创新计算机学校是什么专业,重庆市涪陵创新计算机学校开展增材制造技术教学研讨会...
  5. MT管理器和高级终端Termux
  6. 洛谷 P2782 友好城市
  7. nuiapp请求网络_‎App Store 上的“LEG-NUI”
  8. Flutter elevation属性名称的含义
  9. 自考第三波+GCT考试总结
  10. 阿里李睿博谈自己的折腾路:整个过程爱最重要