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

关于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,根据架构不同而不同。
在这里插入图片描述

Pi0 项目复现及项目问题解决方案(全网抢先发布~) 阅读详情

相关推荐

别再只调API了!深度拆解Dify文件上传的两种传参方式(sys.file vs. inputs.upload_file)

本文深度解析Dify平台文件上传的两种传参方式——sys.file与inputs.upload_file,详细对比其设计原理、技术实现及适用场景。通过代码示例和性能分析,帮助开发者在本地大模型应用中做出精准技术选型,提升文件处理效率与系统稳定性。

weixin_29063979的博客 268

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

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

vast668的博客 2758

【SerDes】美信GMSL2-CSI调试心得

美信GMSL2加解串器芯片家族广泛应用于车载和工业视觉系统。文章介绍了MAX96717/MAX96717F加串器和MAX96724/MAX96724R解串器的关键特性,包括支持MIPI CSI-2接口、6Gbps传输速率等功能。提供了基于高通平台的demo系统配置和调试步骤,重点阐述了Link Lock、PCLK检测和Video Lock等关键调试环节,并详细说明了像素模式,隧道模式的工作原理及寄存器配置示例。文中还包含通过I2C读写寄存器的具体操作指令,取流freeze可能原因和解决方法。

qq_38089448的博客 2490

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

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

u014426028的博客 3135

Cloudflare 5秒盾逆向实战:13次请求背后的Python补环境框架搭建指南

本文深入解析了如何通过Python构建浏览器环境模拟框架,以应对Cloudflare 5秒盾等现代Web防护机制。文章详细拆解了其背后复杂的13次请求链,涵盖了JavaScript执行引擎集成、DOM事件模拟、网络请求控制及Canvas指纹等环境检测的完整实现方案,为自动化数据采集和逆向工程提供了实战指南。

gold的博客 347

Vienna整流器SVPWM调制:7扇区划分与中点电位平衡的MATLAB/Simulink实现解析

本文深入解析Vienna整流器的SVPWM调制技术,重点介绍7扇区划分与中点电位平衡的MATLAB/Simulink实现方法。通过详细的算法推导和仿真模型构建,帮助工程师掌握整流器闭环控制策略,优化功率转换效率。内容涵盖扇区判断逻辑、矢量作用时间计算及中点电位平衡的PID调节等核心技术要点。

weixin_33937499的博客 387

内存数据分区

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

weixin_45460969的博客 967

华为OD机试双机位C卷-停车场收入统计 (Py/Java/C/C++/Js/Go)

华为OD机试双机位C卷 停车场收入统计,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 停车场收入统计。

qq_45776114的博客 2185

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

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

m0_60274660的博客 2365

Zemax与Matlab交互:双胶合优化详细流程

Zemax与Matlab交互:双胶合优化详细流程

weixin_72050316的博客 629

【大模型工程局】告别单打独斗:手把手带你构建多智能体系统(MetaGPT 启示录)

想象一下,不再是只有一个全知全能的 AI,而是有一群各有所长、能够独立思考和行动的“智能体”(Agent)。它们生活在一个共同的环境中,可以相互交流、协作完成共同目标,也可能为了有限资源而相互竞争。这就是多智能体系统(MAS)的核心图景。MAS 的关键特征:自治性 (Autonomy):每个智能体都能独立感知环境、做出决策并执行动作,无需外部直接控制。交互性 (Interaction):智能体之间可以通过某种通信机制(显式或隐式)交换信息、协调行为。

高校图书馆高级系统架构师/研究馆员,推动高校AI从概念演示到可评审、可交付、可运维:路线图与立项评审、PoC交付、评测回归与上线运维(Baseline/Eval/Ops)。 1183

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

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

极简阅读的博客 1770

人工智能技术基础系列之:迁移学习

作者:禅与计算机程序设计艺术 1.背景介绍 随着深度学习和神经网络的快速发展,越来越多的应用场景需要处理大量的数据和复杂的任务。然而,由于计算资源、存储空间等条件的限制,传统的人工智能方法往往不能满足实际需求。因此,为了提高效率和降低成本,研究人员提出了迁移学习的概念。本篇文章将详细介绍迁移学习的基

AI天才研究院 698

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

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

比较是偷走幸福的小偷 2450

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

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

842

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

malloc,calloc分配的内存区域。

2201_75733666的博客 395

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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、付费专栏及课程。

余额充值