最近弄bootloader所以再次复习一下这个内存分配方面的东西,以前弄过,有段时间没弄,就生疏了。
首先编译后在,下面会生成
Program Size: Code=2484 RO-data=392 RW-data=72 ZI-data=1644
。然后在仔细看看MDK生成的map文件就差不多能把这个东西搞透了。
首先下面生成的那个。这里面的概念和MAP里面的概念是不大一样的。在MAP里面,ZI-DATA也数目RW-DATA。
所以下面讲的概念以MAP里面为准。
RO-DATA,就是只读数据,就是const限制的变量。不知道有没有别的变量能让数据成为RO-data。
RW-DATA,就是可以读写数据,包括,ZERO和data两种。注意:(在网上很多人说zero是没被 初始化0。data是被初始化为0)
另外PAD,见名思义,就是对齐的意思。应该是内存对齐吧。不管他。
注意那个bss,我发现,只有是定义数组,就分配到bss中,并且是zero。这个怎么回事 不太清楚。
(我还发现,如果定义全局变量,但是程序中没有用到这个变量,那么是不分配内存的。即便加了static修饰也不分配,这个和KEIL 51好像是有不同,记不太清了)。
(后来又发现,尽管不分配内存,好像在MDK中,和内存对齐有影响),影响如下
若定义了个没有用到的变量U16,则
0x20000000 0x00000014 Data RW 3179 .data
0x20000014 0x00000004 Data RW 3354 .data
0x20000018 0x00000030 Data RW 3616 .data
0x20000048 0x00000009 Zero RW 3353 .bss
0x20000051 0x00000001 PAD
0x20000052 0x0000025a Zero RW 3615 .bss
0x200002ac 0x00000004 PAD
0x200002b0 0x00000400 Zero RW 1 STACK
若不定义则
0x20000000 0x00000014 Data RW 3179 .data
0x20000014 0x00000002 Data RW 3354 .data
0x20000016 0x00000002 PAD
0x20000018 0x00000030 Data RW 3616 .data
0x20000048 0x00000009 Zero RW 3353 .bss
0x20000051 0x00000001 PAD
0x20000052 0x0000025a Zero RW 3615 .bss
0x200002ac 0x00000004 PAD
0x200002b0 0x00000400 Zero RW 1 STACK
好,现在弄个map具体的例子,在看看map和output值是否一致。
//****************************************************************************
Execution Region RW_IRAM1 (Base: 0x20000000, Size: 0x000006b0, Max: 0x00017f00, ABSOLUTE)
Base Addr Size Type Attr Idx E Section Name Object
0x20000000 0x00000014 Data RW 3179 .data
0x20000014 0x00000002 Data RW 3354 .data
0x20000016 0x00000002 PAD
0x20000018 0x00000030 Data RW 3616 .data
0x20000048 0x00000009 Zero RW 3353 .bss
0x20000051 0x00000001 PAD
0x20000052 0x0000025a Zero RW 3615 .bss
0x200002ac 0x00000004 PAD
0x200002b0 0x00000400 Zero RW 1 STACK
Execution Region RW_IRAM2 (Base: 0x20017f00, Size: 0x00000004, Max: 0x00000100, ABSOLUTE, UNINIT)
Base Addr Size Type Attr Idx E Section Name Object
0x20017f00 0x00000004 Zero RW 3178 .ARM.__AT_0x20017F00
=====================================================================================
从上图中可以看出 属性为RW的data为 0x14 + 0x2 + 0x2(PAD)+0x30=0x48=72
属性为RW的zero为 0x09 + 0x1(pad)+0x25a+4(pad)+0x400+0x4=1644
可见,自己算出来的值和 output生成的值是一致的。
这也说明我大概搞懂了这个ZI-RW-RO-data这个东东。