目标文件各代码段、数据段分析
Keil编译后的Code,RO,RW,ZI分别表示什么以及和芯片Flash、SRAM的对应关系
Code:代码的大小
RO:常量所占空间
RW:程序中已经初始化(非0)的变量所占空间
ZI:未初始化的static变量和全局变量以及堆栈所占的空间
上述参数和芯片Flash以及SRAM的对应关系是
Flash占用大小=Code+RO+RW
SRAM占用大小=RW+ZI
---------------------------------------------------------------------------------------------------------------------
Linux下Size命令的输出不包括stack和heap的部分。只包括文本段(text), 代码段(data),未初始化数据段(bss)三部分, 无rodata段。
1、文本段:包含程序的指令,它在程序的执行过程中一般不会改变。
2、数据段:包含了经过初始化的全局变量和静态变量,以及他们的值。
3、BSS段:包含未经初始化的全局变量和静态变量。
4、堆栈段:包含了函数内部声明的局部变量。
在linux下内存分配是以页为单位的。而页是通过段管理。各个段之间是独立的,方便管理。linux程序执行时。能够分为下面几个内存段:一、.bss段 ,一般是指用来存放程序中未初始化的全局变量的一块内存区域。
二、.data段,用于存储初始化的全局变量,初始化为0的全局变量出于编译优化的策略还是被保存在BSS段。
三、.rodata段,也叫常量区,用于存放常量数据,ro就是Read Only之意。
四、.text段,用于存放程序代码的。
五、stack段
六、heap段
1、经过初始化的全局变量和静态变量保存在数据段中。
2、未经初始化的全局变量和静态变量保存在BSS段。
3、函数内部声明的局部变量保存在堆栈段中。
4、const修饰的全局变量保存在文本段中,const修饰的局部变量保存在堆栈段中。
5、字符串常量保存在文本段中。