linux代码段映射,bss,data,text,rodata,堆,栈,常量段与其各段在物理存储中关系
本文想从linux出发【目前还想可不可以从51单片机出发】,解答程序代码和各种数据结构是如何存储(映射)到存储区的。
目前未完成整理,还是初稿的想法。bss段:
BSS段(bsssegment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文BlockStarted by Symbol的简称。BSS段属于静态内存分配。
data段:
数据段(datasegment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。
text段:
代码段(codesegment/textsegment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读,某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
rodata段:
存放C中的字符串和#define定义的常量
heap堆:
堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
stack栈:
是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。
常量段:
常量段一般包含编译器产生的数据(与只读段包含用户定义的只读数据不同)。比如说由一个语句a=2+3编译器把2+3编译期就算出5,存成常量5在常量段中
一般情况下,一个程序本质上都是由 bss段、data段、text段三个组成的——本概念是当前的计算机程序设计中是很重要的一个基本概念。而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的问题。
在采用段式内存管理的架构中(比如intel的80x86系统),bss段(Block Started by Symbol segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时bss 段部分将会清零(bss段属于静态内存分配,即程序一开始就将其清零了)。
比如,在C语言程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中。
l text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中加载;
l 而bss段不在可执行文件中,由系统初始化。
编译两个小程序如下:
程序1:
int ar[30000];
void main()
{
......
}
程序2:
int ar[300000] = {1, 2, 3, 4, 5, 6 };
void main()
{
......
}
发现程序2编译之后所得的.exe文件比程序1的要大得多。 为什么?
区别很明显,一个位于.bss段,而另一个位于.data段,两者的区别在于:
l 全局的未初始化变量存在于.bss段中,具体体现为一个占位符;全局的已初始化变量存于.data段中;
l 而函数内的自动变量都在栈上分配空间。
l .bss是不占用.exe文件空间的,其内容由操作系统初始化(清零);
l 而.data却需要占用,其内容由程序初始化,因此造成了上述情况。
注意:
l bss段(未手动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的大小。
l data(已手动初始化的数据)段则为数据分配空间,数据保存在目标文件中。
l DATA段包含经过初始化的全局变量以及它们的值。
l BSS段的大小从可执行文件中得到,然后链接器得到这个大小的内存块,紧跟在数据段后面。当这个内存区进入程序的地址空间后全部清零。包含DATA和BSS段的整个区段此时通常称为数据区。
const/volatile等都属于“修饰符”,是设在最初起点(编译的语法检查阶段)的很弱的“关卡”,编译的代码生成、存储器分配、连接、执行等阶段都假设“前一道工序已经检查过了,我现在只要当它是普通变量就可以了”(虽然具体编译器有可能将它与普通变量放在不同的数据段,但那没有实质区别)。
linux代码段映射,bss,data,text,rodata,堆,栈,常量段与其各段在物理存储中关系相关推荐
- bss,data,text,rodata,堆,栈,常量段
//红色部分为问题部分 section 结构 SECTIONS { ... secname start BLOCK(align) (NOLOAD) : AT ( ldadr ) { content ...
- linux 目标文件(*.o) bss,data,text,rodata,堆,栈
学习于:http://blog.csdn.net/sunny04/article/details/40627311 linux目标文件 一个简单的程序被编译成目标文件后的结构如下: 注:初始化为0在此 ...
- 汇编中bss,data,text,rodata,heap,stack段的作用
原文:https://blog.csdn.net/bxd1314/article/details/38433837 Table of Contents bss段: data段: text段: roda ...
- STM32——.bss .data .text 与Code, RO-data , RW-data, ZI-data的关系
核心就是RAM和ROM的作用和区别 1 .bss .data .text 1.1 bss段: bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域. bss是英文B ...
- [转]bss,data,rodata,text
2019独角兽企业重金招聘Python工程师标准>>> BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block S ...
- bss、data、rodata和text
在ELF格式的可执行文件中,全局内存包括三种:bss.data和rodata.其它可执行文件格式与之类似.了解了这三种数据的特点,我们才能充分发挥它们的长处,达到速度与空间的最优化. 1.bss(Bl ...
- 全局内存BSS,DATA,RODATA的区别以及其他内存区间相关
刚接触c语言的时候,了解了全局变量这个概念,只知道所谓全局变量的意思就是代码文件里面所有的函数都可以随时调用修改的变量,而其实这种理解是十分不准确的,但随着后期学习的深入,接触了计算机组成原理和汇编的 ...
- bss、data和rodata区别与联系
有人可能会说,全局内存就是全局变量嘛,有必要专门一章来介绍吗?这么简单的东西,还能玩出花来?我从来没有深究它,不一样写程序吗?关于全局内存这个主题虽然玩不出花来,但确实有些重要,了解这些知识,对于优化 ...
- 程序运行时对应的内存分布(BSS段、数据段、代码段、堆、栈)关系
参考:程序运行时对应的内存分布关系 作者:嵌入式基地(公众号) 发布时间: 2021-04-28 网址:https://mp.weixin.qq.com/s/AVDPZawSjg9HtxEm8vsFB ...
最新文章
- [RGEOS]空间拓扑关系
- matplotlib各个部分
- 在HTML中使用javascript (js高级程序设计)
- eclipse中新建JSP文件时的编码设置
- Atitit.检测文本文件的编码 自动获取文件的中文编码
- linux系统如何备份系统软件,Linux系统如何备份
- outlook哪个版本好用
- 兔子繁殖问题:一对兔子从出生后第三个月开始,每月生一对小兔子。小兔子到第三个月又开始生下一代小兔子。假若兔子只生不死,一月份抱来一对刚出生的小兔子,问一年中每个月各有多少对兔子(C++)(迭代法)
- uniapp开发微信小程序设置分包,简单易学(图解)
- 西北工业大学明德学院计算机老师,师资队伍结构
- [搞笑]后舍男生视频
- 高数笔记(十):定积分的概念与性质,微积分基本公式,牛顿-莱布尼兹公式,变限函数求导
- 电磁兼容工程(Electromagnetic compatibility engineering Herry Ott )读书笔记-- 章11 数字电路电源分布
- ExtJs自学教程(2):从DOM看EXTJS
- [Swift通天遁地]一、超级工具-(16)使用JTAppleCalendar制作美观的日历
- python❀序列结构
- 伸手摘星,未必如愿,但不会弄脏你的手……
- 马云说完新零售,范驰开讲新店商
- cesium|xt3d
- 将一个文件复制到另外一个文件中
热门文章
- Delphi利用Windows GDI实现文字倾斜
- Nuget 启用数据库迁移的时候一定要把包含DbContext的项目设为启动项目
- 《统一沟通-微软-实战》-6-部署-2-中介服务器-5-语音路由-语音策略
- MDOP套装之app-v安装使用及功能说明
- 计算机技术基础 VB 答案,《计算机技术基础(VB)》武汉理工大学20春作业一
- 基本程序 打印Scala的Hello World
- java clock计时_Java Clock类| systemUTC()方法与示例
- python日历模块_Python日历模块| prmonth()方法与示例
- 计算机科学技术专业解析,专业解读—计算机科学与技术
- 大一python编程题_请教python编程问题(作业就剩这几道题了)