您的位置 首页 被动

ARM编译空间特点

1程序的空间属性一般情况下,一个程序本质上都是由bss段、data段、text段三个组成的——本概念是当前的计算机程序设计中是很重要的一

1. 程序的空间特色

一般情况下,一个程序本质上都是由 bss段、data段、text段三个组成的——本概念是当时的计算机程序规划中是很重要的一个基本概念。而且在嵌入式体系的规划中也十分重要,牵涉到嵌入式体系运转时的内存巨细分配,存储单元占用空间巨细的问题。

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

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

代码段:代码段(code segment/text segment)一般是指用来寄存程序履行代码的一块内存区域。这部分区域的巨细在程序运转前就现已确认,而且内存区域一般归于只读, 某些架构也答应代码段为可写,即答应修正程序。在代码段中,也有或许包括一些只读的常数变量,例如字符串常量等。

堆(heap):堆是用于寄存进程运转中被动态分配的内存段,它的巨细并不固定,可动态扩张或减缩。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当运用free等函数开释内存时,被开释的内存从堆中被除掉(堆被减缩)

栈(stack):栈又称仓库,是用户寄存程序暂时创立的局部变量,也便是说咱们函数括弧“{}”中界说的变量(但不包括static声明的变量,static意味着在数据段中寄存变量)。除此以外,在函数被调用时,其参数也会被压入建议调用的进程栈中,而且待到调用完毕后,函数的返回值也会被寄存回栈中。由于栈的先进先出特色,所以栈特别便利用来保存/康复调用现场。从这个意义上讲,咱们能够把仓库当作一个寄存、交流暂时数据的内存区。

text和data段都在可履行文件中(在嵌入式体系里一般是固化在镜像文件中),由体系从可履行文件中加载。而bss段不在可履行文件中,由体系初始化。

bss段(未手动初始化的数据)并不给该段的数据分配空间,仅仅记载数据所需空间的巨细。 data(已手动初始化的数据)段则为数据分配空间,数据保存在方针文件中。 DATA段包括通过初始化的全局变量以及它们的值。 BSS段的巨细从可履行文件中得到,然后链接器得到这个巨细的内存块,紧跟在数据段后边。当这个内存区进入程序的地址空间后悉数清零。包括DATA和BSS段的整个区段此刻一般称为数据区。

2. ARM的image特色

ARM程序的组成
此处所说的“ARM程序”是指在ARM体系中正在履行的程序,而非保存在ROM中的bin映像(image)文件,这一点清留意差异。
一个ARM程序包括3部分:RO,RW和ZI
RO是程序中的指令和常量
RW是程序中的已初始化变量
ZI是程序中的未初始化的变量
Image文件包括了RO和RW数据。但不包括ZI数据,是由于ZI数据都是0,没必要包括,只需程序运转之前将ZI数据地点的区域一概清零即可。包括进去反而糟蹋存储空间。

烧录到ROM中的image文件与实践运转时的ARM程序之间并不是彻底相同的。因而就有必要了解ARM程序是怎么从ROM中的image抵达实践运转状况的。
实践上,RO中的指令至少应该有这样的功用:
1.将RW从ROM中搬到RAM中,由于RW是变量,变量不能存在ROM中。
2.将ZI地点的RAM区域悉数清零,由于ZI区域并不在Image中,所以需求程序依据编译器给出的ZI地址及巨细来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中在程序运转的开始阶段,RO中的指令完成了这两项作业后C程序才干正常拜访变量。不然只能运转不含变量的代码。
ARMC中的指令以及常量被编译后是RO类型数据。
ARMC中的未被初始化或初始化为0的变量编译后是ZI类型数据。
ARMC中的已被初始化成非0值的变量编译后市RW类型数据。

.text段是代码段。它用来放程序代码(code)。它一般是只读的(程序代码,编译好了就确认了,不或许改来改去的嘛)。

.data段是数据段。它用来寄存初始化了的(initailized)全局变量(global)和初始化了的静态变量(static)。它是可读可写的。

.bss段是全局变量数据段。它用来寄存未初始化的(uninitailized)全局变量(global)和未初始化的静态变量(static)。它也是可读可写的。bss是英文Block Started by Symbol的缩写。之所以把bss跟data分开来,是由于体系会为这些bss段的变量的初值清零。

.constdata段是常量数据段。它用来寄存常量(const)。它也是只读的。

源程序中运用malloc分配的内存便是bss这一块,它的巨细不是依据data的巨细确认的,主要是由程序中一起分配内存最大值所确认的,不过假如超出了规划,也便是分配失利,能够等空间开释之后再分配。

以上这些段,用户能够十分灵敏的界说其首地址和巨细。但对大部分用户来说,程序代码区在ROM或FLASH中,可读写区域在SRAM或DRAM中。考虑一下自己程序规划,函数调用规划,内存运用巨细,然后,参照一个衔接定位文件,稍加修正就能够了

栈(stack)便是一般咱们所说的仓库。它用来保存函数的局部变量和参数。其操作方法类似于数据结构中的栈,是一种“后进先出”(Last In First Out,LIFO)的数据结构。这意味着最终放到栈上的数据,将会是第一个从栈上移走的数据,关于哪些暂时存储的信息,和不需求长期保存的信息来说,LIFO这种数据结构十分抱负。在调用函数或进程后,体系一般会铲除栈上保存的局部变量、函数调用信息及其它信息。栈的顶部一般在可读写的RAM区的最终,其地址空间一般“向下削减”,即当栈上保存的数据越多,栈的地址就越小。

堆(heap)便是一般咱们说的动态内存分配。它用来办理动态内存的。其操作方法跟数据结构中的堆,是不同的。

在ARM的集成开发环境中,

1、只读的代码段称为Code段,即上述的.text段。

2、只读的常量数据段,被称作RO Data段,即上述的.constdata段。

以上两个段统称为RO段(Read Only),放在ROM或FLASH等非易失性器材中。

3、可读可写的初始化了的全局变量和静态变量段,被称作RW Data段(ReadWrite),即上述的.bss段。

4、可读可写的未初始化的全局变量和静态变量段,被称作ZI Data段(Zero Init),即上述的.data段。由于这个段里的变量要被初始化为零,所以叫ZI段。

以上两个段统称为RW段,而在运转时,它有必要从头装载到可读可写的RAM中。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/beidong/263012.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部