堆栈,BSS,DATA,TEXT

news2025/1/18 20:16:28

一、目标文件

在这里插入图片描述

  1. 首先目标文件的构成,Linux下就是.o 文件
    编译器编译源码后生成的文件叫目标文件(Object File)。
    目标文件和可执行文件一般采用同一种格式,这种存储格式为 ELF。

  2. 目前文件的内容至少有编译后的机器指令代码和数据,除了这些,目标文件中还包含了链接时所必须的一些信息,比如符号表、调试信息、字符串等。

    般目标文件将这些信息按照不同的属性,以段(segment)的形式存储。
    在这里插入图片描述
    代码段(.text):源代码编译过后的机器指令。
    数据段(.data):全局变量和局部静态变量被放在数据段。
    只读数据段(.rodata):const 修饰的变量和其他字符串常量。
    bss 段:为未初始化的符号,预留足够的空间。未初始化的变量在 bss 段。
    其他段
    如下:
    在这里插入图片描述

ELF文件头

ELF 文件开头是一个头文件,它描述的是整个文件的属性,包括:文件的类型、目标硬件、目标操作系统等信息。

代码段;数据段;BSS段等
在这里插入图片描述

代码段

C 语言编译后的机器指令,都保存在代码段(.text)。
将代码段反汇编我们可以发现机器(汇编指令):
在这里插入图片描述

数据段

数据段(.data)保存的是哪些已经初始化(非零)的全局变量(静态变量和非静态变量)和局部静态变量。

只读数据段

只读数据段(.rodata),保存的是只读数据。一般是程序中 const 修饰的只读变量 和字符串常量(包括 printf 函数中的格式化字符串%d)。

BSS段

bss 段(.bss),用来记录所有未初始化的全局变量(或者零初始化)和局部静态变量大小总和,然后为其预留位置。

未初始化的全局变量(或者零初始化)和局部静态变量,因为都是 0,所以在.data 段开辟存储空间存储 0 是没有必要的。

二、应用程序的组成

2.1组成

那么站在高级语言的角度我们将一个程序主要分为如下的段:
代码段
数据段 (变量常量等)
BSS 段(未初始化)


在这里插入图片描述
一个可执行程序至少包含:代码段 + 数据段 + BSS 段。也就是说在存储时(没有加载到内存运行),至少拥有三个部分,分别是代码段(text)、数据段(data)、和BSS 段。

当应用程序运行时(运行态),此时需要另外两个域:堆和栈。正在运行的程序:代码段 + 数据段 + BSS 段 + 堆 + 栈。
在这里插入图片描述

2.2 内存管理

在将应用程序加载到内存空间执行时,操作系统负责代码段、数据段和 BSS 段的加载,并在内存中为这些段分配空间。栈也由操作系统管理,不需要程序员显示的管理;堆段需要程序员自己管理,显示的申请和释放。

  1. 动态分配

在运行时执行动态分配。需要程序员显示管理,通过 malloc 申请,并且需要手动 free 掉,否则会造成内存泄漏。

  1. 静态分配

在编译时就已经决定好了分配多少 Text+Data+Bss+Stack(静态分配)。

静态分配的内存在进程结束后由系统释放(Text+Data),Stack 堆上的数据则在退出函数后立即被销毁。

三、各段说明

3.1 栈

栈保存函数的局部变量(不包括 static 修饰的变量),参数以及返回值。是一种后进先出(LIFO)的数据结构。
在调用函数或过程后,系统会清除栈上保存的局部变量、函数调用信息及其他信息。
栈的另外一个重要特征是,它的地址空间 向下减少,即当栈上保存的数据越多,栈的地址越低。静态内存分配。
注意,由于栈的空间通常比较小,一般 linux 程序只有几 M,故局部变量,函数入参应该避免出现超大栈内存使用,比如超大结构体,数组等,避免出现 stack overflow。

3.2 堆

堆保存函数内部动态分配(malloc 或 new)的内存,是另外一种用来保存程序信息的数据结构。
堆是先进先出(FIFO)数据结构。堆的地址空间是向上增加,即当堆上保存的数据越多,堆的地址越高。动态内存分配。
注意:堆内存需要程序员手动管理内存,通常适用于较大的内存分配,如频繁的分配较小的内存,容易导致内存碎片化。

3.3 BSS

bss 是英文 Block by Symbol 的简称。通常用来存放程序中未初始化和初始化为 0的全局变量的一块内存区域,在程序载入时由内核清零。数据段属于静态内存分配

3.4 数据段

通常用来存放程序中已初始化的(非 0)全局变量和静态局部变量。数据段的起始位置由链接定位文件确认,大小在编译链接时自动分配。数据段属于静态内存分配

3.4 代码段

代码段在内存中被映射为只读。它是由编译器在编译链接时自动计算的。通常是用来存放程序执行的指令。代码段输入静态内存分配。
总结:
在这里插入图片描述

参考:
https://zhuanlan.zhihu.com/p/347262004

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1293719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PCB设计】嘉立创EDA器件3D模型导入AD的方法

嘉立创EDA器件3D模型导入AD的方法 一、嘉立创EDA导出3D模型二、CAD编辑3D模型三、AD中加载3D模型 一、嘉立创EDA导出3D模型 在嘉立创EDA中找到对应的元器件,并生成PCB,选择导出3D文件 导出元件step模型 二、CAD编辑3D模型 用FreeCAD打开模型 删除…

SpringSecurity(一)

【第一篇】SpringSecurity的初次邂逅 1.Spring Security概念 Spring Security是Spring采用 AOP思想,基于 servlet过滤器实现的安全框架。它提供了完善的认证机制和方法级的授权功能。是一款非常优秀的权限管理框架。 Spring Security是一个功能强大且高度可定制的身…

Linux——操作系统与进程的基础概念

操作系统与进程的基础概念 本章思维导图: 注:思维导图对应的.xmind和.png文件都已同步导入至资源 1. 操作系统(OS) 操作系统的基本概念: 操作系统(operator system)简称OS,是一个管理软硬件资源的软件 1.…

honle电源维修UV电源控制器EVG EPS40C-HMI

好乐UV电源控制器维修;honle控制器维修;UV电源维修MUC-Steuermodul 2 LΛmpen D-82166 主要维修型号: EVG EPS 60/120、EVG EPS 100、EVG EPS200、EVG EPS 220、EVG EPS 340、EVG EPS40C-HMI、EVG EPS60 HONLE好乐uv电源维修故障包括&#…

11K+ Star!图解计算机网络、操作系统、计算机组成、数据库!

大家好,我是 Java陈序员。 俗话说得好,面试造火箭,入职拧螺丝。我们在工作中,其实很少用到一些计算机底层知识,往往只要编码完事。但是,知其然还要知其所以然,我们不仅要做一个合格的“CV 工程…

luceda ipkiss教程 41:画跑道型微环

利用picazzo库中的方向耦合器绘制跑道型微环: from si_fab import all as pdk from ipkiss3 import all as i3 from picazzo3.wg.dircoup import StraightDirectionalCouplerclass RingResonator(i3.PCell):trace_template i3.TraceTemplateProperty(defaultpdk.Si…

[Geek Challenge 2023] klf_2详解

考点 SSTI、join拼接绕过 fuzz测试后发现过滤了很多关键字 我们先试试构造__class__ {% set podict(po1,p2)|join()%} //构造pop {% set alipsum|string|list|attr(po)(18)%} //构造_ {% set cl(a,a,dict(claa,ssa)|join,a,a)|join()%} //构造__class__ {% set …

『TypeScript』深入理解TypeScript基本类型及其应用

📣读完这篇文章里你能收获到 掌握TypeScript的基本及高级数据类型掌握TypeScript的类型系统 文章目录 一、基本类型1. 类型声明2. 基本数据类型2.1 数字(Number)2.2 字符串(String)2.3 布尔值(Boolean&…

YOLOv8改进 | 2023 | DiverseBranchBlock多元分支模块(有效涨点)

一、本文介绍 本文带来的改进机制是YOLOv8模型与多元分支模块(Diverse Branch Block)的结合,Diverse Branch Block (DBB) 是一种用于增强卷积神经网络性能的结构重新参数化技术。这种技术的核心在于结合多样化的分支,这些分支具有…

机器学习应用 | 使用 MATLAB 进行异常检测(上)

异常检测任务,指的是检测偏离期望行为的事件或模式,可以是简单地检测数值型数据中,是否存在远超出正常取值范围的离群值,也可以是借助相对复杂的机器学习算法识别数据中隐藏的异常模式。 在不同行业中,异常检测的典型…

Linux 文件写入报错E297: Write error in swap file

错误原因 Linux系统不能向文件写入内容,无论写入都无保存,并且提示下文信息 E297: Write error in swap file "abc.txt" [New File] Press ENTER or type command to continue 经过查找资料得知可能是磁盘满了。通过df -h命令查看磁盘情况…

互联网Java工程师面试题·RabbitMQ篇

目录 1、什么是 rabbitmq 2、为什么要使用 rabbitmq 3、使用 rabbitmq 的场景 4、如何确保消息正确地发送至 RabbitMQ? 如何确保消息接收方消费了消息? 5、如何避免消息重复投递或重复消费? 6、消息基于什么传输? 7、消息如…

新农村建设集中污水处理需要哪些设备

新农村建设集中污水处理是一个关乎环境保护和农村发展的重要议题。在实施该项目时,需要一系列专业设备来确保污水处理的高效性和可持续性。 首先,在新农村建设集中污水处理中,最基本的设备是污水收集系统。这包括地下管网、检查井和泵站等设施…

C++新经典模板与泛型编程:SFINAE特性的信息萃取

用成员函数重载实现is_default_constructible 首先介绍一个C标准库提供的可变参类模板std::is_default_constructible。这个类模板的主要功能是判断一个类的对象是否能被默认构造(所谓默认构造,就是构造一个类对象时,不需要给该类的构造函数…

Linux 网络协议

1 网络基础 1.1 网络概念 网络是一组计算机或者网络设备通过有形的线缆或者无形的媒介如无线,连接起来,按照一定的规则,进行通讯的集合( 缺一不可 )。 5G的来临以及IPv6的不断普及,能够进行联网的设备将会是越来越多&#xff08…

12、组合模式(Composite Pattern,不常用)

组合模式(Composite Pattern),有时又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。 它在我们树型结构的问题中…

微信小程序动态加载图表[echart]

1.引入Echarts (1)将ec-canvas文件拷贝下来放到你自己的项目中: (2)在你需要使用Echarts的页面的json文件中引入Echarts "usingComponents": {"ec-canvas": "../utils/ec-canvas/ec-canva…

[⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记

前言 DPD 数字预失真技术,是一种用于抑制功率放大器非线性失真的方法。 它通过在信号输入功率放大器(PA)之前插入一个预失真模块,对输入信号进行适当的调制,以抵消功率放大器引起的非线性失真,使功率放大器…

【AIGC】prompt工程从入门到精通--图片生成专题

本文为系列教程【AIGC】prompt工程从入门到精通的子教程。 一、介绍 与文本提示相比,找到最佳的提示词来生成完美的图片并没有那么成熟。这可能是因为创建对象自身的挑战,这些对象基本上是主观的并且往往缺乏良好的准确性度量方法。 本指南涵盖了基本…

【libcurl库】OpenSSL 库、多线程、断点续传(二)

一、libcurl函数库常用字段解读 1、curl_global_init():初始化libcurl2、curl_easy_init():得到easy interface型指针,拿到句柄3、curl_easy_setopt(CURL *handle, CURLoption option, parameter):设置传输选项 第二个参数CURLop…