浅谈text段、data段和bss段
一般情况,一个程序本质上都是由 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段相关推荐
- 浅谈CSS首字放大下沉及段首缩进2字符
1.CSS首字放大下沉 对首字进行放大下沉,需用到css的伪元素:first-letter. <!doctype html> <html><head><sty ...
- text段,data段,bss段,堆和栈
红色部分为问题部分 堆和栈的区别 一.预备知识-程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等 ...
- C.2#【数据段】—2.数据段data、bss、rodata
1.1 data 段 用来存储已经初始化的全局变量,也属于静态内存分配区,会占用程序文件空间. 与bss相比,data就容易明白多了,它的名字就暗示着里面存放着数据.当然,如果数据全是零,为了优化考虑 ...
- bss段和data段的区别
一.bss与data 一般情况下,一个程序本质上都是由 bss段.data段.text段三个组成的--本概念是当前的计算机程序设计中是很重要的一个基本概念.而且在嵌入式系统的设计中也非常重要,牵涉到嵌 ...
- ELF中的.data段和.bss段
.data 段: 已初始化的全局变量和局部静态变量都保存在 .data 段. .bss 段: 未初始化的全局变量和局部静态变量默认值都为 0,本来它们也可以被放在 .data 段的,但是因为它们都是 ...
- BSS段,数据段,代码段,堆内存和栈
BSS段,数据段,代码段,堆内存和栈 作者:delnabla 日期:2010-10-26 字体大小: 小 中 大 BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的 ...
- BSS段、数据段、代码段、堆与栈
BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 ...
- 代码段+数据段+bss段+stack+heap
在学习之前我们先看看ELF文件. ELF分为三种类型:.o 可重定位文件(relocalble file),可执行文件以及共享库(shared library),三种格式基本上从结构上是一样的,只是具 ...
- C++ 堆区,栈区,数据段,bss段,代码区(详解)
各段的介绍 一般情况下,一个可执行C程序在内存中主要包含5个区域,分别是代码段(text),数据段(data),BSS段,堆段(heap)和栈段(stack).其中前三个段(text,data,bss ...
最新文章
- view5.3登录桌面提示当前可用桌面资源不足
- 手把手教你使用深度学习的方法进行人脸解锁
- VMware CTO:未来VMware NSX与思科ACI将有更多整合
- 一个恶心的无法同步服务器与pda时间的龌龊问题
- spring 配置多数据源
- 前端学习(2440):axios处理文章数据
- sharepoint webpart
- 5G关键技术研究方向
- CSS3新属性:在网站中使用访客电脑里没有安装的字体
- 华为将发布“鸿蒙”以取代 Android 系统
- infortrend ESDS RAID6故障后的数据恢复方案
- 6个html5手机游戏源码,html5逗你玩手机游戏源码
- html表单鼠标悬停变色,当我将鼠标悬停在html表格中时,更改单元格中颜色的颜色...
- 电商系统购物车流程图
- 阿里月饼事件被辞程序员冤吗
- Error: ENOENT: no such file or directory, scandir .....
- 结构方程模型amos中介效应与调节效应
- 求求你了!别瞎提交代码了,看人家 Git 提交规范那叫一个舒服!
- cnblogs!I'm comeing!
- Day2--正则表达式