数据段、代码段、堆、栈详解

关于text段、data段和bss段 根据APUE,程序分为下面的段:.text, data (initialized), bss, stack, heap。 data/bss/text: text段在内存中被映射为只读,但.data和.bss是可写的。 bss是英文Block Started by Symbol的简称,通常是指用来存放程序中未初始化的全局变量的一块内存区域,在程序载入时由内核清0。BSS段属于静态内存分配。它的 阅读详情

原文:https://blog.youkuaiyun.com/weixin_38233274/article/details/80321719
一 程序文件中的分区:
备注:只针对嵌入式,pc程序文件没有探究过。小标题“程序文件中的分区”其实不是很恰当,不知道该如何形容,此部分概念通常出现在一个程序编译完成后的大小统计,请自行理解。

相关概念:Code,RO_data,RW_data,ZI_data,RO,RW,常出现在嵌入式程序编译完成后的统计,例如MDK,IAR,ARM GCC。

有些技术文章中会直接使用RO,请注意区分RO和RO-data的区别。

Code:即代码域,它指的是编译器生成的机器指令。
RO_data:ReadOnly data,即只读数据域,它指程序中用到的只读数据,全局变量,例如C语言中const关键字定义的全局变量就是典型的RO-data。
RW_data:ReadWrite data,即可读写数据域,它指初始化为“非0值”的可读写数据,程序刚运行时,这些数据具有非0的初始值,且运行的时候它们会常驻在RAM区,因而应用程序可以修改其内容。例如全局变量或者静态变量,且定义时赋予“非0值”给该变量进行初始化。
ZI_data:ZeroInitialie data,即0初始化数据,它指初始化为“0值”的可读写数据域,它与RW_data的区别是程序刚运行时这些数据初始值全都为0,而后续运行过程与RW-data的性质一样,它们也常驻在RAM区,因而应用程序可以更改其内容。包括未初始化的全局变量,和初始化为0的全局变量。
RO:只读区域,包括RO_data和code。

当程序存储在ROM中时,所占用的大小为Code + RO_data + RW_data 。
当程序执行时, RW_data和 ZI_data在RAM中,RO_data和code视cpu架构(51、arm、x86)不同处于ROM或者RAM中。其中ZI_data对应了BSS段,RW_data对应数据段,code对应代码段, RO_data对应数据段。

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

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

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

堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)若程序员不释放,则会有内存泄漏,系统会不稳定,Windows系统在该进程退出时由OS释放,Linux则只在整个系统关闭时OS才去释放(参考Linux内存管理)。

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

它是由操作系统分配的,内存的申请与回收都由OS管理。

PS:

全局的未初始化变量存在于.bss段中,具体体现为一个占位符;全局的已初始化变量存 于.data段中;而函数内的自动变量都在栈上分配空间。.bss是不占用.exe文件空间的,其内容由操作系统初始化(清零);而.data却需要占 用,其内容由程序初始化,因此造成了上述情况。

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

data(已手动初始化的数据)段则为数据分配空间,数据保存在目标文件中。 数据段包含经过初始化的全局变量以及它们的值。BSS段的大小从可执行文件中得到 ,然后链接器得到这个大小的内存块,紧跟在数据段后面。当这个内存区进入程序的地址空间后全部清零。包含数据段和BSS段的整个区段此时通常称为数据区。

三. 总结
以上几个概念的对应关系如下表中所示:
备注:粉色部分的code和RO_data文字颜色为灰色,表示可能发生在ROM,也可能发生在RAM,根据架构不同而不同。
在这里插入图片描述

阻容降压 vs 开关电源:5V小功率供电方案成本与安全深度对比 本文深度对比了阻容降压电路与开关电源在5V小功率供电方案中的核心差异。重点剖析了二者在成本、体积、效率、温升及安全隔离等方面的优劣,并结合智能温控器、LED驱动等典型应用场景,为硬件工程师提供了清晰的选型决策框架,帮助在成本与安全之间做出最佳权衡。 阅读详情

相关推荐

SAP SD POD 配置与 VLPOD 操作:3步解决发货10件开票7件的业务场景

本文详细解析了SAP SD POD功能在解决发货与开票数量差异中的应用,通过3步配置法实现精准匹配。重点介绍了POD核心逻辑、关键配置步骤及VLPOD操作技巧,帮助企业高效处理易损品运输等复杂场景,提升供应链管理效率。

weixin_30613343的博客 394

对栈区、堆区、bss区、代码区的理解jikuo_wang

计算机中的内存按字节编址 每个地址的存储单元可以存放一个字节(8个bit)的数据 cpu通过内存地址获取指令和数据 并不关心这个地址所代表的空间具体在什么位置,怎么分布, 因为硬件的设计保证一个地址对应着一个固定的空间。 即:内存地址和地址指向的空间共同构成了一个内存单元 ----------------------------------- C语言编写的程序而言,内存主要分为5部分 (1)栈和(2)堆是运行时系统分配的空间 (3)BSS段(未初始化)、(4)数据段(已初始化)、(5...

vast668的博客 2758

ggml_cgraph 详解

是 GGML 库的(Computation Graph)结构,它是深度学习框架的核心,用于表示、优化和执行神经网络的计算过程。

zhouzwd87的专栏 1203

静态存储区(BSS、数据段、代码段),堆,栈-----------------(划归在C语言)

进程(执行的程序)会占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等。不过进程对这些内存的管理方式因内存用途不一而不尽相同,有些内存是事先静态分配和统一回收的,而有些却是按需要动态分配和回收的。对任何一个普通进程来讲,它都会涉及到5种不同的数据段。 Linux进程的五个段 下面我们来简单归纳一下进程对应的内存空间中所包含的5种不同的数据区都是干什么的。 BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。...

u014426028的博客 3135

深入理解DQN中的Q值:核心概念和应用

在强化学习中,Q值(或称为动作价值函数)是核心概念之一。Q值函数 ( Q(s, a) ) 表示在给定状态 ( s ) 下,采取动作 ( a ) 并遵循某策略后,智能体从当前状态到未来状态所能获得的预期总回报。简言之,Q值是评估特定状态和动作对的好坏的指标。

qlkaicx的博客 2975

【数字电源/MATLAB+PLECS】如何进行 Buck 数字电源仿真(二)PLECS 搭建开环 Buck 功率级

本文介绍了如何在PLECS中搭建开环Buck功率级模型,验证数字电源设计的基本思路。重点内容包括: 明确开发顺序:先开环验证功率级,再闭环设计控制器 搭建关键组件:输入电源、PWM模块、MOSFET开关、续流二极管、LC滤波电路及负载 设置初始参数:24V输入、12V输出、200kHz开关频率、22μH电感、100μF电容 测量关键波形:MOSFET Vds验证开关动作、电感电流纹波和输出电压稳态值 提供完整仿真模型和GitHub资源,便于读者复现验证 文章强调通过开环测试先确保功率级正确性,为后续闭环控制

weixin_43234123的博客 1218

内存数据分区

内存分区主要包括静态储存区、栈区、堆区、代码区这四个区,本文主要根据这四个区进行总结。

weixin_45460969的博客 967

39、信号流图:解决线性代数方程组的图论方法

本文介绍了信号流图理论在求解线性代数方程组中的应用,重点阐述了Coates方法和Mason方法的原理、步骤及对比分析。通过图论视角,将矩阵运算转化为对有向图结构的分析,利用1-因子、1-阶连接、前向路径和反馈回路等概念,推导出方程组解的拓扑公式。文章结合具体实例演示两种方法的计算过程,并总结其在电路分析、控制系统和通信系统等领域的拓展应用,展示了信号流图理论的直观性与有效性。

pear55的博客 87

进程的用户空间的内存分配

查看一个文件内存情况: 一个进程的数据在内存中的存储分5部分: BSS区:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 数据区:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。 代码区:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区.

m0_60274660的博客 2365

把 SNC 支持的通信链路一次讲透,SAP GUI、RFC、CPIC、SAProuter 到底谁在保护谁

摘要: SNC(Secure Network Communications)是SAP系统中用于保护特定通信链路的安全机制,主要应用于DIAG、RFC、CPIC等SAP协议,而非HTTP等互联网协议(后者由SSL/TLS处理)。其核心在于保护通信端点之间的逻辑链路,需在发起方和接收方同时配置SNC参数,包括SNC名称、保护等级(QoP)等。实际项目中,SNC的配置涉及多个层面,如SAP GUI到ABAP平台的登录链路、外部程序通过RFC/CPIC连接ABAP的认证、ABAP系统间的跨系统通信等。配置不当可能导

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 250

YOLOv11 | 一文带你深入理解ultralytics最新作品yolov11的创新 | 训练、推理、验证、导出 (附网络结构图)

ultralytics发布了最新的作品YOLOv11,这一次YOLOv11的变化相对于ultralytics公司的上一代作品YOLOv8变化还是很大的(YOLOv9、YOLOv10均不是ultralytics公司作品),其中改变的位置涉及到C2f变为C3K2,在SPPF后面加了一层类似于注意力机制的C2PSA,还有一个变化大家从yaml文件是看不出来的就是它的检测头内部替换了两个DWConv,在损失函数方面就没有变化了还是采用的CIoU作为边界框回归损失,下面带大家深入理解一下ultralytics最新作品

Snu77的博客 18万+

内存布局详解(栈、堆、数据段、代码段)

C程序运行时内存分为多个功能区域:1)栈区用于存储函数调用时的临时数据,自动管理但大小有限;2)堆区支持动态内存分配,需手动管理;3)数据段包含.bss(未初始化数据)、.data(已初始化数据)和.rodata(只读数据);4)代码段存放可执行指令。各区域具有不同的存储内容、管理方式和访问权限,理解内存布局是调试内存问题和优化程序性能的基础。

极简阅读的博客 1770

RK3568 Android14 调试 RTL8211F 千兆以太网 (RGMII)

调试 RTL8211F 的核心在于:确认地址(看电阻贴片情况)和 搞定延时(配置 rgmii-id 或微调 delay 值)。一旦这两点对上了,RK3568 的千兆网络就能稳定运行。希望这篇结合原理图的实战记录能帮到你!

qq_33427070的博客 1649

进程地址空间布局详解:代码段、数据段、堆、栈、内存布局

进程地址空间布局是操作系统内存管理的基础。为什么32位程序最多用4GB内存?代码段、数据段、堆、栈分别在哪里?栈为什么向下增长?为什么有内核空间和用户空间?理解虚拟地址空间的划分、各段的作用和位置、栈堆的增长方向、地址随机化机制,才能掌握进程内存管理的本质。从"栈溢出覆盖数据"问题出发,剖析进程地址空间布局的核心原理。通过代码段的只读共享、数据段的读写分离、堆的动态增长、栈的向下扩展、内核空间的高地址映射,揭秘虚拟地址空间组织的完整逻辑。配合详细布局分析,给出内存分段、权限控制的透彻理解。南北绿豆地址空间。

比较是偷走幸福的小偷 2450

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

BSS段、数据段、代码段、堆与栈详解

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

842

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

有关栈 堆 数据段 代码段 的面试题详解

malloc,calloc分配的内存区域。

2201_75733666的博客 395

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C++内存分布详解:栈、堆、数据段、BSS与代码段全解析

C++内存布局是程序运行的底层基石,它定义了变量、代码和常量在虚拟地址空间中的物理归属。其核心原理基于操作系统对虚拟内存的分段管理机制,通过页表与MMU实现权限隔离与地址映射,从而保障安全性与稳定性。这一机制直接支撑着内存安全、缓存优化、多线程共享及调试可靠性等关键技术价值。典型应用场景涵盖段错误排查、内存泄漏分析、栈溢出防护、智能指针设计以及嵌入式资源约束下的内存规划。深入理解C++内存分布,尤其是栈、堆、数据段、BSS段与代码段的协同关系,是掌握C++底层行为、提升系统级工程能力的关键前提。

weixin_33270920的博客 252

代码段、数据段、堆:进程内所有线程共享,知识体系一共包含哪些部分及其详解?底层原理是什么?

函数调用独立性:每个线程有独立的函数调用链,需要独立的栈来保存调用帧。安全考虑:避免一个线程修改另一个线程的栈数据。实现方式:创建线程时,操作系统为其分配一块独立的栈内存(通常在进程虚拟地址空间的不同区域)。

长风破浪会有时的博客 1495

嵌入式内存详解:栈、堆、全局区和静态区分别存什么?

栈是一块按“后进先出”方式使用的内存区域。函数参数;局部变量;返回地址;CPU寄存器;中断现场;临时计算结果;函数调用链信息。FunctionA入栈↓FunctionB入栈↓FunctionC入栈↓FunctionC返回并释放↓FunctionB返回并释放↓FunctionA返回并释放栈空间会随着函数调用逐渐消耗,函数返回后逐渐恢复。堆是用于动态内存分配的区域。/* 分配失败 */return;/* 使用buffer */

m0_69912407的博客 511

C语言内存布局全解析:栈、堆与虚拟地址空间底层原理

了解进程的虚拟地址空间是深入C语言内存管理的基础。程序运行时,内核通过MMU将物理内存映射为独立的虚拟地址空间,其中代码段、数据段、BSS段、堆和栈各司其职,共同决定了变量与函数调用的生命周期。栈帧的压栈与弹栈定义了局部变量的作用域,而malloc的堆分配则依赖brk与mmap及底层chunk机制,分配策略直接影响碎片率与性能。理解这些底层原理,有助于排查缓冲区溢出、悬空指针与内存泄漏等高频问题,并能借助ASan、Valgrind等工具快速定位越界与释放后使用。在编程实践中,掌握内存布局还能通过对象池、统一

weixin_32247165的博客 160

内存段划分:代码段、数据段、堆、栈

内存段划分:代码段、数据段、堆、栈 ld 时把所有的目标文件的代码段组合成一个代码段,把所有的数据段组合成一个数据段.   ############################################################################ 数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内

Ahuageyuanquan的专栏 1308

C语言内存全景图:从栈、堆到指针,彻底搞懂变量存储与分配

程序运行时,数据在内存中如何布局?栈、堆、数据段、代码段各司其职,局部变量、全局变量、动态分配的内存分别存放在哪里,直接决定了程序的行为与稳定性。理解内存模型是C语言进阶的核心,也是排查段错误、内存泄漏、悬垂指针等高频问题的前提。无论是手动管理malloc与free,还是处理数组越界、结构体对齐、字符串常量不可修改等经典坑点,底层都指向同一套存储规则。掌握字节序、内存对齐、指针类型步长等概念,能帮助你写出更高效的代码;而借助Valgrind或AddressSanitizer等工具,则能在工程实践中快速定位隐

weixin_33462927的博客 305

全局变量分配在数据段_再谈应用程序分段:代码段、数据段、bss以及堆和栈

天星读完需要4分钟速读仅需 2 分钟分段本身就是一个比较复杂的内容,值得再专门写一遍文章介绍,本文再前文基础上再谈应用程序的分段1 ELF 文件旧文讲过 ELF 文件结构大致如下图:我们知道 ELF 文件包含三种类型:可重定位文件(*.o)、可执行文件、以及共享库(share library)。三种文件格式从结构上来说基本一致,只是具体到每一个结构不同。代码段(.text)是可执行指...

weixin_35159405的博客 1770

内存空间布局:代码段、数据段,栈,堆 ,寄存器

首先看一段代码: 1 #include 2 3 int glob_val; //global uninitialized 4 int glob_val2 = 2; //global initialized 5 //int glob_val5 = 4; 6 //int glob_val6 = 4; 7 static in

big_bit的博客 7976

【内存分布】代码段、数据段、栈、堆

本文用于讨论进程中的代码部分,相关的数据结构是处于进程的那一段。又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。--可执行的代码/只读常量,如string定义的常量。对于任何一个普通的进程来说,他们都会涉及到5种不同的。动态申请的内存,堆是可以上增长的。用于程序运行时动态内存分配。

weixin_45845865的博客 1190

C++内存管理的理解--不同位置定义的变量分别存放在栈、堆、数据段还是代码段?以及大小、长度

- 栈:在函数内部定义的局部变量/函数参数/返回值等,存放在函数栈内。 - 堆:通过动态开辟出来的空间,都放在堆上,比如定义了一个指针指向一块动态开辟的空间,指针本身可能存放在别的地方,但是该指针存放的内容是堆上的地址,**该指针的解引用获取的内容也是堆上的东西**。 - 数据段:**包含全局数据和静态数据**。全局定义的变量,或者任何位置(全局或者函数内部)定义的静态变量都存放在数据段中。 - 代码段:可执行代码/只读常量。文本数据等都属于常量,存放在代码段中。

m0_49619206的博客 547
上一篇: Git重置命令--git reset用法总结
下一篇: 字符输入输出sacnf/getchar/gets/printf/putchar/puts
Colorful_lights
博客等级 码龄10年 27粉丝 38原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值