可执行程序中的BSS段

BSS段:

BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。BSS节不包含任何数据,只是简单的维护开始和结束的地址,以便内存区能在运行时被有效地清零。BSS节在应用程序的二进制映象文件中并不存在。如果在嵌入式里,很可能没加载器,你的程序是直接由bootload程序加载到内存的。这个时候,bss区域是否被清0,要看写bootload代码的人了。因为这种bootload通常要自己写的。

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

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

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

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

   

    ld 时把所有的目标文件的代码段组合成一个代码段,把所有的数据段组合成一个数据段。text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中加载;而bss段不在可执行文件中,由系统初始化。

时间: 2024-12-03 08:45:50

可执行程序中的BSS段的相关文章

linux编程-关于linux内存 数据段和bss段的疑惑???

问题描述 关于linux内存 数据段和bss段的疑惑??? 数据段和bss段分别存放 已初始化/未初始化 的全局变量和静态变量. 那么,假如bss段的全局变量和静态变量在代码执行中被初始化了,那么会不会被转移到 数据段存储呢??? 解决方案 首先我觉得你所说的在执行中被初始化的说法是不正确的,应该叫赋值. 接下来我们看一段代码: #include <stdio.h> int a; int b=10; int c=11; int main(void) { int d; int e=12; ret

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

最近在复习一些以前的知识点,整理了一些相关的基本概念,以下的概念网上有博客已经提出了,在此我将这些知识点进行总结: 5个数据段        进程(执行的程序)会占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等.不过进程对这些内存的管理方式因内存用途 不一而不尽相同,有些内存是事先静态分配和统一回收的,而有些却是按需要动态分配和回收的.对任何一个普通进程来讲,它都会涉及到5种不同的数据段. Linux进程的五个段 下面我们来简单归纳一下进程对应的内存空间中所

Sql语句,当在页面插入一个字段的时候,和数据库中的表字段进行对比,有这个名字就数量相加

问题描述 Sql语句,当在页面插入一个字段的时候,和数据库中的表字段进行对比,有这个名字就数量相加 Sql语句,当在页面插入一个字段的时候,和数据库中的表字段进行对比,有这个名字就数量相加,没有的话重新加入一条新的记录,Sql语句怎么实现? 当我页面添加的是"利群"时,添加一盒,那么数据库中利群这条记录中的num字段中的4变成5,如果是页面添加的是"黄鹤楼"同理,如果添加的不是name字段中的这两个,就新插入一条数据.Sql语句怎么写??急急急. 是Mysql的数据

gdn-要求在一个 0 级代码段中将源数据段中的一段数据传输到目标数据段中段描述符均放臵在全局描述符表 GDT 中。

问题描述 要求在一个 0 级代码段中将源数据段中的一段数据传输到目标数据段中段描述符均放臵在全局描述符表 GDT 中. 这个怎么弄啊 要求在一个 0 级代码段中将源数据段中的一段数据传输到目标数据段中.其中所有 段的段描述符均放臵在全局描述符表 GDT 中. 解决方案 具体来说可以这么实现: 在程序开始声明一个数据段? DSEG?,来描述这三个段的描述符,其中有代码段描述符CODEM,源数据段描述符 DATAS 和目标数据段描述符 DATAD,将它们相应的选择子分别定义为 CODEM_SEL,

如何得到数据库中所有表字段及字段中文描述

数据|数据库|中文 如何得到数据库中所有表字段及字段中文描述以下资料,通过csdn的一位师兄从SQL版主那得到:sql中SELECT (case when a.colorder=1 then d.name else '' end) N'表名', a.colorder N'字段序号', a.name N'字段名', (case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end) N'标识', (case whe

ORA-01652错误:无法通过128(在表空间TEMP中)扩展temp段

在Oracle数据库中进行order by or group by.索引的创建和重创建.distinct操作.union & intersect & minus sort-merge joins.Analyze 操作.异常等操作时,会产生很多的临时数据.如有一张员工信息表,数据库中是安装记录建立的时间来保存的.如果用户查询时,使用Order BY排序语句指定按员工编号来排序,那么排序后产生的所有记录就是临时数据.通常情况下,Oracle数据库会先将这些临时数据存放到内存的PGA(程序全局区

如何在Sql2008中获取表字段属性和注释

  如何在Sql2008中获取表字段属性和注释? select b.[value] from sys.columns a left join sys.extended_properties b on a.object_id=b.major_id and a.column_id=b.minor_id inner join sysobjects c on a.column_id=c.id and a.[name]='列名' and c.[name]='表名' SELECT 表名=case when

如何在word文档中给一段文字加上底色

  如何在word文档中给一段文字加上底色          一个常用的软件,就能让一段文字更富表现力,如何用word给一段文字加上底色,快来学习吧! 效果图: 步骤 1.输入一段文字 2.选定要加底色的文字 3.在"格式"中选择"边框和底纹" 4.在"底纹"中选择想要的颜色,然后按"确定"按钮 5.就完成了!

Linux源代码情景分析中P54的“不要把进程映像中的这些段跟段式存储管理中的段相混淆”是啥意思

问题描述 Linux源代码情景分析中P54的"不要把进程映像中的这些段跟段式存储管理中的段相混淆"是啥意思 不要把进程映像中的这些段跟段式存储管理中的段相混淆?这两个的区别和联系是啥?求大神解答