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等都属于“修饰符”,是设在最初起点(编译的语法检查阶段)的很弱的“关卡”,编译的代码生成、存储器分配、连接、执行等阶段都假设“前一道工序已经检查过了,我现在只要当它是普通变量就可以了”(虽然具体编译器有可能将它与普通变量放在不同的数据段,但那没有实质区别)。

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

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

相关文章

python求123逆序数_应用Python来计算排列中的逆序数个数

在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。一个排列中所有逆序总数叫做这个排列的逆序数。也就是说,对于n个不同的元素&am…

linux共享文件可读写,在Ubuntu中设置samba共享可读写文件夹

在Ubuntu中设置samba共享可读写文件夹发布时间:2007-03-15 01:01:08来源:红联作者:XLooking首先当然是要安装samba了,呵呵:sudo apt-get install sambasudo apt-get install smbfs下面我们来共享群组可读写文件夹,假设你要共享的文件夹为&…

python频谱分析_基于Python的频谱分析(一)

1、傅里叶变换傅里叶变换是信号领域沟通时域和频域的桥梁,在频域里可以更方便的进行一些分析。傅里叶主要针对的是平稳信号的频率特性分析,简单说就是具有一定周期性的信号,因为傅里叶变换采取的是有限取样的方式,所以对于取样长度…

python 武沛齐_武沛齐 - 主页

${content}你输入的邮件地址曾经通过${type}激活了本站帐号,请使用${type}帐号直接登录。课程习题:提示请选择一个答案提交查看正确答案下一题${option}: ${content}{if multiple}{else}{/if}{if defined("xlist")&&!!xlist.length}{l…

linux全过程图解图片,安装 Mandriva Linux全过程《图解》

wide 于 2006-02-26 10:29:58发表:设定帐号Mandriva 是一个可供多人使用的作业系统,使用者必须先在系统中拥有帐号才可以使用。而登入时,则必须输入帐号及密码,验证无误后方可进入。 本章将介绍如何在安装时设定使用者帐号及密码。何谓系统管…

mnist torch加载fashion_Pytorch加载并可视化FashionMNIST指定层(Udacity)

加载并可视化FashionMNIST在这个notebook中,我们要加载并查看 Fashion-MNIST 数据库中的图像。任何分类问题的第一步,都是查看你正在使用的数据集。这样你可以了解有关图像和标签格式的一些详细信息,以及对如何定义网络以识别此类图像集中的模…

linux 查看socket fd,linux socket中select()函数以及FD_ZERO FD_SET FD_CLR FD_ISSET

linux socket非阻塞编程时常见到如下的code:socket s;.....fd_set set;.....struct timeval tv;while(1){FD_ZERO(&set);//将你的套节字集合清空FD_SET(s, &set);//加入你感兴趣的套节字到集合,这里是一个读数据的套节字stv.tv_sec 3;tv.tv_usec 0;select(maxf…

pytorch默认初始化_Pytorch 实现权重初始化

pytorch 怎么定义多任务学习中的不同任务的权重pytorch 怎么定义多任务学习中的不同任务的权重 搜索资料 我来答 分享 微信扫一扫 新浪微博 QQ空间 举报 浏览15 次 本地图片 图片链接 代码 提交回答pytorch训练好的模型能用在keras或tensorflow吗我最近在找一个resnet18的权重…

c语言程序编写一朵花,一朵花(中英双语)

一朵花A Flower作者|白鹤清泉(Baihe Qingquan)英译|周柯楠(Zhou Kenan)轻轻地走近你的世界Gently I approach your world默默地与你对视Looking you in the eye silently我用眼睛嘴唇与你贴近I keep close to you with my eyes and lips只为听到你芬芳的…

k3 审核流程图_3-金蝶K3操作流程图详解

一、流程图符号说明:______________________________________________ 3二、K/3系统基础操作流程图:___________________________________ 4A、“中间层—账套管理”_________________________________________________ 4B:系统基础资料_____…

c语言链表贪吃蛇教程,编《贪吃蛇》最简单的算法,链表法

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include#include#include#include#define ESC 0x011b#define UP 0x4800#define DOWN 0x5000#define LEFT 0x4b00#define RIGHT 0x4d00struct rode{int x;int y;struct rode *next;};struct rode *head,food;void initgra(…

硬解析优化_72最近一次现场生产系统优化的成果与开发建议

上周给南京某客户一个重要业务系统的数据库做优化,能实施的马上做了实施,优化前后性能对比非常明显,系统最为严重的IO负载过重问题基本得到解决:优化前一天的物理读是48亿次,优化后是15亿次,效果那是刚刚的…

c语言中的运算符按位或,|按位或运算符

|按位或运算符,同样,它也与我们前面学过的逻辑或运算符类似,只有一个竖线表示,作用位,两个对应的二进制位有一个为1结果即为1。如8|7的运算过程可以如下表示:8 0000 0000 0000 0000 0000 0000 0000 1000…

为什么仿宋字体打印出楷体_win7缺少仿宋_GB2312和楷体_GB2312字体,造成word字体显示不正常...

领导反映说自己电脑上word显示的字体和打印机打出来的字体不一样。且别人发过来的word文件格式会不一样,本来只有2页的,到她那里会变成3页。她说会不会是字体有问题。我说要看一下。我当时想也可能是word设置有问题。后来上网查了下,说win7系…

android动态开发,android开发实现动态壁纸

释放双眼,带上耳机,听听看~!代码中有用到两个接口IWallpaperService mService;IWallpaperEngine mEngine;我们可以看到该目录下面有三个aidl接口,分别是复制代码 代码如下:interface IWallpaperConnection {void attachEngine(IWa…

build 之前执行task_浅谈VS编译自定义编译任务—MSBuild Task(csproject)-阿里云开发者社区...

在上一篇浅谈.NET编译时注入(C#-->IL)中我们简单的反编译查看了几种c#语法糖和PostSharp在编译成IL时为我做的MSIL注入。紧接着在这节,要来看的就是MSBuild Task。在我们的代码预编译过程中我们可以创建我们自己的任务Task。下面我们就开始做一个简单的Task。1&a…

xml层级工具_.NET的类型层次查看工具,ClassHierarchyViewer,0.3.0.1

上周为了快速了解一个.NET的库而需要查看其类型层次。假如要在文章中表示一个类型层次,还是用文本比较舒服,截图始终是不方便。Reflector虽然能够显示类型层次,但我无法方便的把显示出来的类型层次转换为文本形式。而且,Reflector…

XM7 FOR ANDROID,视频剪辑制作app-视频剪辑制作xm8.0安卓版-蜻蜓手游网

视频剪辑制作是一款很好用的手机视频编辑软件,在这里你可以进行视频剪辑、制作字幕、背景音乐制作等,让你可以轻松的制作视频,需要视频剪辑制作的就来蜻蜓手游网下载吧!软件功能【背景配乐】给视频添加背景音乐,支持MP…

css宋体代码_css中宋体怎么设置?

CSS 能够对网页中元素位置的排版进行像素级精确控制,支持几乎所有的字体字号样式,拥有对网页对象和模型样式编辑的能力。下面我们来看一下css设置宋体的方法。css设置宋体代码如下:div里面设置字体宋体样式全局设置字体样式font-family 规定元…

android极光推送声音,android 极光推送 声音与振动 的关闭和开启

前言:最近刚好在写一些推送方面的东西,又是新手,不断在网上找资料,很少,不过还是找到了一些,反正百度我是再也不想百度了,谷歌一下子就能找到想要的。废话不多说。1.主要方法就是如下一个函数pr…