在指定内存地址定义了一个常量以后,编译查看map文件,发现如果程序小于常量的地址,内存分配的时候就可以从0开始,如果程序长度大于常量的地址,但内存分配的时候却是从常量之后的地址开始的。
icf文件:
/*================================*/
define symbol __ICFEDIT_intvec_start__ = 0x0;
define symbol __ICFEDIT_password_start__ = 0x00000FC0;
......
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place at address mem:__ICFEDIT_password_start__ { readonly section .password };
/*================================*/
startup.s文件:
/*================================*/
SECTION .password:CODE
DCD 0xFFFFFF12
/*================================*/
编译后生成的map文件:
/*================================*/
"A1": place at 0x00000000 { ro section .intvec };
"A2": place at 0x00000fc0 { ro section .password };
"P1": place in [from 0x00000000 to 0x0001ffff] { ro };
"P2": place in [from 0x20000000 to 0x20001fff] { rw, block CSTACK, block HEAP };
/*================================*/
map文件中实际函数P1的内存分配情况:
/*================================*/
"P1": 0x4b44
.text ro code 0x00000fc4 0x4a58 test.o [1]
.text ro code 0x00005a1c 0x1c reset.o [1]
.text ro code 0x00005a38 0x32 main.o [1]
......
/*================================*/
入门菜鸟,鞠躬~
此帖出自
小平头技术问答
一周热门 更多>