一个C程序的内存布局(memory layout)

ADS笔记,新旧两组仿真数据进行绘图和列表对比 原理图器件参数的不同,怎么进行对比观看,操作如下。 阅读详情
一个C程序一直以来都是由以下5个段(pieces)组成:

代码段(text segment):

存放CPU执行的机器指令(machine instructions)。通常情况下,代码段是可共享的,使其可共享的目的是对于频繁被执行的程序,只需要在内存中有一份拷贝即可,比如文本编辑器 (text editors),C编译器,shell等等。另外,代码段也通常是只读的,使其只读的原因是防止一个程序意外地修改了它的指令(prevent a program from accidentally modifying its instructions)。

 

初始化数据段/数据段(initialized data segment/data segment):

该段包含了在程序中明确被初始化的变量。例如,一个不在任何函数内的C声明(C declaration)
int   maxcount = 99;
使得变量maxcount根据其初始值被存储到初始化数据段。

 

未 初始化数据段/bss段(uninitialized data segment/"bss" segment):

bss这个叫法是根据一个早期的汇编运算符而来,这个汇编运算符标志着一个块的开始(stood for "block started by symbol")。在程序开始执行之前,bss段的数据被kernel初始化为0或者空指针(null pointers)。一个不在任何函数内的C声明
long  sum[1000];
使得变量sum被存储到未初始化数据段/bss段中。

 

栈 段(stack):

where automatic variables are stored, along with information that is saved each time a function is called. 每次当一个函数被调用,该函数的返回地址和一些关于caller的信息,比如某些寄存器的内容,将被首先存储到栈段。然后这个被调用的函数 (caller)再为它的自动变量和临时变量(automatic and temporary variables)在栈段上分配空间。这就是C如何实现函数的递归调用。每次一个递归函数调用其本身,一个新的栈框架(stack frame)就会被使用,这样这个新实例栈里的一组变量就不会和该函数的另一个实例栈里面的变量互相干扰。

 

堆段(heap):

用于动态内存分配(dynamic memory allocation)。一直以来,堆在内存中的位置是介于bss段和栈段之间。

在一个a.out中,还有许多段类型存在(Several more segment types exist in an a.out)。 如符号表(symbol table),调试信息(debugging information),动态共享库的连接表(linkage tables for dynamic shared libraries)等。这些额外的section(不是segment)不会作为被一个进程执行的程序映象的一部分。

 

从图7.6中要注意到bss段的内容没有被存储到磁盘上的程序文件中(the program file on disk)。这是因为kernel在程序开始运行之前将该段都置为0。程序中唯一需要被存储到程序文件中的部分是代码段和初始化数据段。运行在Intel x86处理器上的linux,代码段(text segment)从地址0x08048000开始(往上),栈底从地址0xC0000000往下(在这个特定的表示结构中,栈段从高地址向低地址扩展)。 在堆顶和栈顶之间的虚拟地址空间是很大的(这保证了2个段不会互相干扰)。

命令size会报告这3个段的大小:代码段,初始化数据段,未初始化数据段。例如:
$ size /usr/bin/cc /bin/sh
       text     data   bss     dec     hex   filename
      79606     1536   916   82058   1408a   /usr/bin/cc
     619234    21120 18260  658614   a0cb6   /bin/sh
第四和第五列是这3个段的总计大小,分别以十进制和十六进制表示出来。

别再硬啃C代码了!用Simulink的Matlab Function模块手把手教你搭建CRC8校验模型(附完整M脚本) 本文详细介绍了如何利用Simulink的Matlab Function模块轻松实现CRC8校验模型,替代传统的C代码编写。通过可视化建模和即时验证,开发者可以高效完成算法设计,并自动生成嵌入式代码。文章包含完整的M脚本示例和工程实践技巧,特别适合嵌入式系统开发人员提升工作效率。 阅读详情

相关推荐

4D毫米波雷达与激光雷达融合评测:3种主流融合框架在极端天气下的性能对比

本文深度评测了4D毫米波雷达与激光雷达在极端天气下的三大融合框架性能,包括前融合、特征级融合和后融合。通过实测数据对比,揭示了多传感器融合在暴雨、浓雾等恶劣环境中的显著优势,为自动驾驶感知系统提供了关键的技术参考和工程实践指南。

weixin_28677005的博客 331

C程序的内存布局(Memory Layout)

C语言程序的内存布局 C语言程序的内存布局结构,包括连接过程中目标程序各个段的组成和运行过程中各个段加载的情况。 C语言程序在内存中各个段的组成 C语言程序连接过程中的特性和常见错误 C语言程序的运行方式 C语言程序的存储区域         由C语言代码(文本文件)形成可执行程序(二进制文件),需要经过编译-汇编-链接三个阶段。编译过程把C语言文本文件生成汇编程序,汇编过程把汇编

OSKernelLAB(gatieme) 2万+

使用STM输出互补SPWM波(三相各差120°)

使用STM32输出SPWM波形(三相各差120°)

hello011102的博客 7373

kernel内存、地址

1 物理地址、虚拟地址、总线地址 2 编址方式 2.1 外设访问 2.1.1 映射 3 虚拟地址映射 4 内存布局 4.1 动态映射区 4.2 永久映射区 4.3 固定映射区 4.4 high memory 4.5 DMA 4.6 实际内存布局 5 /proc/目录下的内存结点 5.1 iomem 5.2 meminfo 5.3 vmallocinfo 6 分配内存函数 6.1 ...

ivychend的博客 2790

【Chipyard】Gemmini快速上手

Gemmini 加速器在 ResNet50 推理任务中表现出计算密集型优势,核心操作周期分布符合深度学习模型特征,推理预测流程完整且测试通过,为后续硬件优化和模型部署提供了有效参考。

2361

cs231n作业 assignment 1 q1 q2 q3

请先看课程作业地址。有两种做作业的方法,一种是在google Colab上做 (需魔法),另一种就是下载到本地,但是我懒得在本地配置环境,太麻烦了,还得修改一些基础代码,我就直接在google colab上做了google colab 配置环境只需要跟着教程走就好了最后还有一题解答题懒得做的,这个题目做的没啥意思。让我们用简单写法来实现softmax的loss函数与梯度计算。

Leezed525的博客 9277

从 ELF 视角理解 C/C++ 程序的内存布局:通用段、C++ 专属段与加载机制解析

本文深入解析了C/C++程序从ELF文件到内存运行的加载机制。首先阐述了ELF文件的双重视角:面向编译链接的section和面向运行时加载的segment。内核通过execve()系统调用,基于segment建立虚拟内存映射而非直接拷贝文件内容,并采用按需加载策略。 文章详细分析了核心内存区域的特性:.text段存储可执行代码(R-X权限),.rodata存放只读数据(R--权限),.data包含已初始化变量(RW-权限且可能COW),.bss段则记录未初始化变量(不占文件空间)。特别指出线程局部存储(TL

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1646

【深度学习|语义分割之UNet】如何使用ResNet50 作为 U-Net 网络的骨干网络(backbone)并使用预训练的 ResNet50 模型。附代码及解读。

【深度学习|语义分割之UNet】如何使用ResNet50 作为 U-Net 网络的骨干网络(backbone)并使用预训练的 ResNet50 模型。附代码及解读。

985小水博的摸鱼日常 3091

eCos学习笔记 2

1、编译一个 C、C++ 应用程序因为各个目标的编译选项各不相同,参考examples/Makefile 文件或“Global compiler flags” option (CYGBLD_GLOBAL_CFLAGS) 编写 Makefile文件; 2、Debugging Techniques(调试技巧)A、Tracing;B、Kernel Instrumentation;

aaaaatiger--寻路 1190

virtuoso:layout如何做flat修drc

有些drc在virtuoso layout中修更节省时间,比如遇到一些via array需要做删改时,发现工具把via array做成了一个cell,如图。去改cell可能会影响很多via,所以最好的办法是做flat,去调整cut,比如删除。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 342

手把手教你学Simulink--基于储能系统的建模与仿真场景:-锂电池储能系统充放电管理策略仿真

《锂电池储能系统充放电管理的Simulink建模与仿真》摘要 本文详细介绍了使用Simulink+SimscapeElectrical对锂电池储能系统进行充放电管理策略建模的全过程。从系统结构设计入手,重点阐述了锂电池模型、充放电控制器、热管理系统等核心模块的搭建方法,并提供了完整的仿真流程。文章详细说明了如何实现荷电状态管理、温度控制和功率限制等关键策略,通过仿真分析了电池电压、电流、SoC和温度等关键指标的变化规律。最后提出了基于仿真结果的优化建议,包括参数整定、算法改进等方面,为锂电池储能系统的安全高

MHD0815的博客 1万+

ELF格式解读-程序头与内存布局

前言 ELF格式解读-(1) elf头部与节头 我们知道ELF中有一个头部叫程序头,这个头部专门用于将ELF加载内存中使用。 参考 Why ELF program headers have two LOAD entries, while the program layout three sections Hardening ELF binaries using Relocation Read-Only (RELRO) [阅读型]CTF中linux pwn的四大基本防御措施 Program Header

不会写代码的丝丽 3176

【论文解读--Xdog】新型电驱式四足机器人研制与测试

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、四足机器人体型大小和驱动方式的比较二、四足机器人设计一些重要的结论三、系统控制框架四、系统硬件框架五、力位混合控制(阻抗控制)六、侧向平衡控制(和VMC如出一辙)七、电机驱动系统研制(FOC磁场定向控制)总结 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对新型电驱式四足机器人研制与测试做个简单的介绍,具体内容后续再更,其他模块可以参

qq_35635374的博客 3727

C程序的内存布局 Memory Layout

C程序的内存布局 Memory Layout

ugfffj的博客 266

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

一个C程序的内存布局(memory layout)(转)

一个C程序一直以来都是由以下5个段(pieces)组成: 代码段(text segment):存放CPU执行的机器指令(machine instructions)。通常情况下,代码段是可共享的,使其可共享的目的是对于频繁被执行的程序,只需要在内存中有一份拷贝即可,比如文本编辑器(text editors),C编译器,shell等等。另外,代码段也通常是只读的,使其只读的原因是防止一个...

java开发指南博客 【转载】 140

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

7.6. 一个C程序的内存布局(memory layout)

7.6.一个C程序的内存布局(memory layout)一个C程序一直以来都是由以下5个段(pieces)组成:代码段(text segment):存放CPU执行的机器指令(machine instructions)。通常情况下,代码段是可共享的,使其可共享的目的是对于频繁被执行的程序,只需要在内存中有一份拷贝即可,比如文本编辑器(text editors),C编译器,shell等等。另外,

password636的专栏 5087

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C语言中的内存布局(memory layout)

C语言中的内存布局(memory layout) 2019.11.20 FesianXu 前言 最近看了关于内存布局的文章[1],感觉讲的很好,结合他这里的原文,这里做大部分的翻译和理解注释等,希望对各位有所帮助。 ∇\nabla∇联系方式: e-mail: FesianXu@gmail.com QQ: 973926198 github: https://github.com...

机器学习杂货铺1号店 3967

1.1. C语言内存布局 (Memory Layout in C)

本文详细解析了嵌入式C程序在微控制器(MCU)中的内存布局,包含五个核心区域:代码段(.text)存储程序指令和只读常量于Flash中;数据段(.data)存放已初始化的全局变量,需占用Flash和RAM双份空间;BSS段(.bss)存储未初始化的全局变量,仅占用RAM;栈(Stack)管理函数调用和局部变量;堆(Heap)用于动态内存分配。由于嵌入式系统资源有限,理解这些内存区域的特点和优化内存使用至关重要,可避免程序崩溃和硬件损坏。文章通过实例代码演示了不同变量在内存中的具体位置。

Rach的博客 1008

C 内存布局 Memory Layout of C Programs

C 内存布局 Memory Layout of C Programs A typical memory representation of C program consists of following sections. Text segment Initialized data segment Uninitialized data segment Stack Heap 1. Text Segment: A text segment , also known as a code segment or

weixin_43626209的博客 462

c++ 使用未初始化的内存_C语言中的内存布局(memory layout)

C语言中的内存布局(memory layout) 2019.11.20 FesianXu 前言最近看了关于内存布局的文章[1],感觉讲的很好,结合他这里的原文,这里做大部分的翻译和理解注释等,希望对各位有所帮助。∇ 联系方式:e-mail: FesianXu@gmail.comQQ: 973926198github: https://github.com/FesianXu知乎专栏...

weixin_29800175的博客 1644

C/C++ Memory Layout

本文介绍了C/C++中由源程序到可执行文件的步骤,和可执行程序的内存布局,数据存储类别,最后还通过一个例子来说明。变量(函数外):如果未初始化,则存放在BSS段;否则存放在data段变量(函数内):如果没有指定static修饰符,则存放在栈中;否则同上常量:存放在文本段.text函数参数:存放在栈或寄存器中文本段:包含实际要执行的代码(机器指令)和常量。它通常是共享的,多个实例之间共享文本段。文本段是不可修改的。初始化数据段:包含程序已经初始化的全局变量,.data。

A19720252059的博客 776
上一篇: linux汇编之命令行参数
下一篇: Linux Shell基本工作原理
mindview
博客等级 码龄19年 7粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值