Chinaunix首页 | 论坛 | 博客
  • 博客访问: 321451
  • 博文数量: 26
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 915
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-20 14:54
文章分类

全部博文(26)

文章存档

2010年(3)

2009年(14)

2008年(9)

我的朋友

分类: C/C++

2009-08-06 10:12:09

根据APUE,程序分为下面的段:.text, data (initialized), bss, stack, heap

data/bss/text:

text段在内存中被映射为只读,但.data.bss是可写的。

bss是英文Block Started by Symbol的简称,通常是指用来存放程序中未初始化的全局变量的一块内存区域,在程序载入时由内核清0BSS段属于静态内存分配。它的初始值也是由用户自己定义的连接定位文件所确定,用户应该将它定义在可读写的RAM区内,源程序中使用malloc分配的内存就是这一块,它不是根据data大小确定,主要由程序中同时分配内存最大值所确定,不过如果超出了范围,也就是分配失败,可以等空间释放之后再分配。

text段是程序代码段,在AT91库中是表示程序段的大小,它是由编译器在编译连接时自动计算的,当你在链接定位文件中将该符号放置在代码段后,那么该符号表示的值就是代码段大小,编译连接时,该符号所代表的值会自动代入到源程序中。

data包含静态初始化的数据,所以有初值的全局变量和static变量在data区。段的起始位置也是由连接定位文件所确定,大小在编译连接时自动分配,它和你的程序大小没有关系,但和程序使用到的全局变量,常量数量相关。

stack/heap:

(stack)保存函数的局部变量和参数。是一种“后进先出”(Last In First OutLIFO)的数据结构,这意味着最后放到栈上的数据,将会是第一个从栈上移走的数据。对于哪些暂时存贮的信息,和不需要长时间保存的信息来说,LIFO这种数据结构非常理想。在调用函数或过程后,系统通常会清除栈上保存的局部变量、函数调用信息及其它的信息。栈另外一个重要的特征是,它的地址空间“向下减少”,即当栈上保存的数据越多,栈的地址就越低。栈(stack)的顶部在可读写的RAM区的最后。

(heap)保存函数内部动态分配内存,是另外一种用来保存程序信息的数据结构,更准确的说是保存程序的动态变量。堆是“先进先出”(First In first OutFIFO)数据结构。它只允许在堆的一端插入数据,在另一端移走数据。堆的地址空间“向上增加”,即当堆上保存的数据越多,堆的地址就越高。

.c中分为这几个存储区  
  1.
  -   有编译器自动分配释放  
  2.
  -   一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收  
  3.
全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的>另一块区域。-   程序结束释放  
  4.
另外还有一个专门放常量的地方。   -   程序结束释放  
 
.C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。  
  1.
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。  
  2.
堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程>序结束后,操作系统会自动回收。  
  3.
自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。  
  4.
全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。  
  5.
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)  
 
所以静态变量和全局变量放在全局/静态存储区,而常量存放在常量存储区,程序代码当然放在代码区了

text段是代码段。它用来放程序代码(code)。它通常是只读的(程序代码,编译好了就确定了,不可能改来改去的嘛)。

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

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

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

源程序中使用malloc分配的内存就是bss这一块,它的大小不是根据data的大小确定的,主要是由程序中同时分配内存最大值所确定的,不过如果超出了范围,也就是分配失败,可以等空间释放之后再分配。

以上这些段,用户可以非常灵活的定义其首地址和大小。但对大部分用户来说,程序代码区在ROMFLASH中,可读写区域在SRAMDRAM中。考虑一下自己程序规模,函数调用规模,内存使用大小,然后,参照一个连接定位文件,稍加修改就可以了

stack就是通常我们所说的堆栈。它用来保存函数的局部变量和参数。其操作方式类似于数据结构中的栈是一种后进先出Last In First OutLIFO)的数据结构。这意味着最后放到栈上的数据,将会是第一个从栈上移走的数据,对于哪些暂时存储的信息,和不需要长时间保存的信息来说,LIFO这种数据结构非常理想。在调用函数或过程后,系统通常会清除栈上保存的局部变量、函数调用信息及其它信息。栈的顶部通常在可读写的RAM区的最后,其地址空间通常向下减少,即当栈上保存的数据越多,栈的地址就越小。

heap就是通常我们说的动态内存分配。它用来管理动态内存的。其操作方式跟数据结构中的堆,是不同的。

ARM的集成开发环境中,

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

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

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

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

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

以上两个段统称为RW段,而在运行时,它必须重新装载到可读可写的RAM中。

阅读(3073) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~