2019独角兽企业重金招聘Python工程师标准>>>

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

数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。

代 码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经 确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新 分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)

栈 (stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变 量,static意味着在数据段中存放变 量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会 被存放回栈中。由于栈的先进先出特点,所以 栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

//红色部分为问题部分

section 结构
SECTIONS {
...
secname start BLOCK(align) (NOLOAD) : AT ( ldadr )
{ contents } >region :phdr =fill
...
}
secname:段名
contents:决定哪些内容存放在此段
start:本段的连接地址(实际运行地址)
AT(ldadr):存储地址(加载的地址)

//例子U-Boot.lds代码(根据上面的section的介绍,虽能大体看懂,但是还是有些许疑惑)
SECTIONS
{
. = 0x00000000; // ?????此处对应 section结构中 哪个标识,我觉得应该是存储地址吧?? 但却没有 AT 标识 
. = ALIGN(4); //此处应该是4字节对齐的意思,???? 但对应section结构中的哪个标志不是很明白
.text : //此处应该是secname 段名
{
cpu/arm920t/start.o
(.text) //大括号,应该为contents段,指示该段存放的内容
*(.text)
}
. = ALIGN(4); //以下类似
.rodata : { *(.rodata) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
.got : { *(.got) }
. = .;

__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;

. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}

问题1,二进制文件不包含BSS段,那把BSS段放在哪 
答:修改有1000个全局变量,难道要BIN里要存1000个0吗?在链接脚本里把BSS段组织在一起,记下它的起始地址、结束地址,重定位后把这块内存清0即可

问题2:全局变量不初始化的话默认初始化为零,干嘛还要手动清零 
答:因为它是在BSS段的

bss段:

BSS段(bsssegment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文BlockStarted by Symbol的简称。BSS段属于静态内存分配。

data段:

数据段(datasegment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。

text段:

代码段(codesegment/textsegment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读,某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

rodata段:

存放C中的字符串和#define定义的常量

heap堆:

堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)

stack栈:

是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

常量段:

常量段一般包含编译器产生的数据(与只读段包含用户定义的只读数据不同)。比如说由一个语句a=2+3编译器把2+3编译期就算出5,存成常量5在常量段中

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

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

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

l text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中加载;

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

编译两个小程序如下:

程序1:

int ar[30000];
void main()
{

......

}

程序2:

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

......

}

发现程序2编译之后所得的.exe文件比程序1的要大得多。 为什么?

区别很明显,一个位于.bss段,而另一个位于.data段,两者的区别在于:

l 全局的未初始化变量存在于.bss段中,具体体现为一个占位符;全局的已初始化变量存于.data段中;

l 而函数内的自动变量都在栈上分配空间。

l .bss是不占用.exe文件空间的,其内容由操作系统初始化(清零);

l 而.data却需要占用,其内容由程序初始化,因此造成了上述情况。

注意:

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

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

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

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

转载出自:
http://hi.baidu.com/zhangzhixxm/item/a93e31f5f37f4ab031c199d7

转载于:https://my.oschina.net/mummy108/blog/138396

[转]bss,data,rodata,text相关推荐

  1. 链接脚本中 text、data、bss、rodata 段含义

    我们一般编译出来的代码都包含在 text. data. bss 和 rodata 这四个段内,链接脚本中常常对这 4 个段进行布局. 全局变量才算是程序的数据,局部变量不算程序的数据,只能算是函数的数 ...

  2. STM32——.bss .data .text 与Code, RO-data , RW-data, ZI-data的关系

    核心就是RAM和ROM的作用和区别 1 .bss .data .text 1.1 bss段: bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域. bss是英文B ...

  3. C/C++程序内存布局(data段,bss段,text段)以及static关键字详解

    目录 1.内存布局 1.1 data段(可读可写) 1.2 text段(只读) 1.3 bss段(可读可写) 1.4 堆区 1.5 栈区 1.6全局区/静态区 1.7 字符串常量区 1.8 代码区 1 ...

  4. Failed to find data source: text

    出现问题如下: sing Spark's default log4j profile: org/apache/spark/log4j-defaults.properties Exception in ...

  5. bss,data,text,rodata,堆,栈,常量段

    //红色部分为问题部分 section 结构 SECTIONS { ... secname start BLOCK(align) (NOLOAD) : AT ( ldadr )   { content ...

  6. linux代码段映射,bss,data,text,rodata,堆,栈,常量段与其各段在物理存储中关系

    本文想从linux出发[目前还想可不可以从51单片机出发],解答程序代码和各种数据结构是如何存储(映射)到存储区的. 目前未完成整理,还是初稿的想法.bss段: BSS段(bsssegment)通常是 ...

  7. 汇编中bss,data,text,rodata,heap,stack段的作用

    原文:https://blog.csdn.net/bxd1314/article/details/38433837 Table of Contents bss段: data段: text段: roda ...

  8. linux 目标文件(*.o) bss,data,text,rodata,堆,栈

    学习于:http://blog.csdn.net/sunny04/article/details/40627311 linux目标文件 一个简单的程序被编译成目标文件后的结构如下: 注:初始化为0在此 ...

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

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

最新文章

  1. 业界 | 计算芯片革命来临?英伟达谷歌入局紧逼英特尔
  2. PHP在各种HTTP服务器上运行模式分析
  3. 【建议收藏】二叉树的序列化与反序列化
  4. intellij 常用设置
  5. 分析递归函数的时间复杂度
  6. Flutter 动画组件
  7. 【渝粤教育】国家开放大学2018年春季 0273-21T中国现代文学 参考试题
  8. windows执行oracle脚本,Windows下通过计划任务执行数据库备份脚本
  9. 鸿蒙第三代手机,荣耀Magic 3最新确认,鸿蒙系统+双6400万,最期待的荣耀来了
  10. matlab保存图片时不使用指令设置图像分辨率、尺寸等
  11. android studio 找不到reosurce,EF 6 Bridge Table Insert Not Working
  12. 个税系统代理服务器参数是什么,个税系统网络参数设置服务器地址
  13. 项目经理要“谋定而后动,知止而有得,万事皆有法,不可乱也”
  14. jquery 打开网页自动弹出遮罩层或点击弹出遮罩层
  15. 制造业的日子为啥难过?因为这几个痛点没有解决
  16. c语言子函数作用是什么意思,C语言编译器中常见的函数用法以及作用详解
  17. python 单元测试出现 Ran 0 tests in 0.000s OK Empty suite
  18. kali 2022.2 安装GVM
  19. 如何编写快速高效的SQL查询(一)——MySQL8.0优化器查询优化处理与样例
  20. java properties文件 变量_properties文件和环境变量

热门文章

  1. indexOf与includes的区别
  2. linux centos ppp限速,Centos7限速和测速
  3. ?php echo $this_php如何使用echo输出常量+变量?
  4. 安卓 App 库存系统开发 终端设备 SDK 分析
  5. java thread 内存泄露_记一次ThreadLocal引发的内存泄露
  6. php mysql 空值_PHP / MySQL插入空值
  7. java添加主类包_java – Maven bundle插件 – 如何添加主类
  8. kafka性能高的影响因素
  9. VB 域名转换IP地址函数
  10. 马斯克圣诞节晒太空飞船:明年4月测试,5年后飞火星