内存的分配方式
五个区 :堆区、栈区、全局区、文字常量区、程序代码区
这五个区是ram中的。或者说,堆栈段、数据段、代码段
而rom中,没有堆区和栈区,只有数据段和代码段。
ram是在程序运行是的内存
rom是程序烧录的地方
Flash(闪存)、EEprom,都是rom
Flash容量大,是程序存储器,按照块擦除,用于存储BootLoader和程序代码
E方是数据存储器,容量小,可以一次擦除一个字节(在有些项目中要求字节对齐,有最小擦除单位,例如四个字节)
一般E方大小是1k 几k
ram分
静态sram。是目前最读写快的存储器,静态的意思是不掉电不丢失数据
动态dram。它比sram慢,但依然比任何rom读写快,需要定时的刷新操作。
有一种说法,程序分为三部分 .data .code(text).bss
data是初始化的全局变量和静态局部变量
bss是未初始化的全局变量和静态局部变量 bss不占用内存,因为static的局部变量、未初始化的全局变量,初始值为0
而在存储时没必要去存储这么多的0 。在生成可执行文件.exe 时 记录所需内存的大小。链接器从.exe文件中的得到bss的大小
紧随在数据段的后面,由操作系统清0(它的初始化值不占用.EXE的空间)
code 是二进制程序代码与一些文字常量
ROM
.data
.code(.text)
RAM
.heap
.stack
.data
.code(text) 代码是存储在rom中的,但是运行时仍需要copy到ram中去,有些编译器会自动识别
常用的代码并将其存储在ram中。另外,代码也可以直接在rom上运行,不过速度会
慢一些(具有sram接口的norflash)
.constdata 文字常量区说法不一,不太重要,存储const常量与文字常量(有说文字常量存储在.code中的)
编译的过程: