1. C的内存分布模型
C的内存分布模型主要有5个:
- stack (栈)
- heap (堆)
- BSS(Uninitialized data segment)
- Data(Initialized data segment)
- Text(程序代码区)
2.各个模型介绍
2.2 栈(stack)
(1)栈是由编译器自动分配和释放的,存放局部变量,函数的参数、返回值。
(2)当发生函数调用时,会创建栈,堆包含函数的局部变量参数和返回值;
(3)栈的操作方式类似数据结构中的栈,后进先出,函数变量在调用时被推送到堆栈中,函数变量在返回时从堆栈中弹出;
(4)SP(stack pointer),堆栈指针始终指向栈的顶部;
(5)栈由高地址(栈底)向低地址(栈顶)生长;
2.2 堆(heap)
(1)堆是由程序员手动分配和释放,这个不同于数据结构中的堆,分配方式类似链表,由malloc(C语言)或 new(c++)来分配,free(c语言)和delete(c++)释放,若程序员不释放,程序结束后由系统释放。
(2)堆由低地址向高地址生长,和栈相反;
2.3 BSS(Uninitialized data segment)
(1)BSS段存放没有初始化的全局变量和静态变量,程序结束后由系统释放
(2)该段的变量在系统启动的时候被初始化为0再加载到内存中;
2.4 Data(Initialized data segment)
(1)DATA段存放初始化的全局变量和初始化静态变量,程序结束后由系统释放
(2)它具有读写权限,因此可以在运行时更改该段的变量值
2.5 Text(程序代码区)
(1)程序代码区存放函数体的二进制代码、以及常量;
(2)文本段是一个只读段,它在程序的执行过程中一般不会改变,用于防止程序被意外修改
3.text data bss dec 代表的含义
在stm32中flash就是ROM,掉电数据不会丢失(通常保存着text段、Code、Ro-data、Rw-data)
RAM就是运行内存,掉电数据就丢失(通常保存着堆、栈、bss段、data段、ZI-data、RW-data)
实际编译结果如下图所示:
其中:
1、text文本段:编译后的二进制程序源码,烧录后存放在FLASH存储器中,程序执行时由加载器(loader)从可执行文件拷贝到内存中,为了安全考虑,防止别的区域更改代码区数据(即可执行指令),代码区具有只读属性。
2、data数据段:包含了经过初始化的全局变量和静态变量,以及他们的值。当单片机启动的时候data段会被拷贝到内存的相应位置。
3、bss段:包含未经初始化的全局变量和静态变量。单片机启动的时候被初始化为0再分配到内存中。
以上3部分内存在程序运行器件会一直存在。
4、dec段:dec(decimal的缩写,即十进制数)是text、data和bss的算术和:2080+196+1796=4072
5、hex段:是text、data和bss的算术和的十六进制表示,4072用十六进制表示就是0xfe8。