本帖最后由 jplzl 于 2014-3-17 09:15 编辑
关键两点:
1.adr r0,_start是条PC相关的指令,即r0 = (PC+8) +/- _start ?
即r0存放_start地址值
可以查看反汇编 arm-linux-gcc-objdump -D vmlinux > vmlinux.s
_star为起始值,可表明内核映像放置的位置(flash或RAM)
即:
如果是在flash,_start=0x0000 0000 假设放置在flash地址0x0000 0000处
如果是在SDRAM,_start=0x0c70 0000 假设放在SDRAM地址0x0c70 0000处
2.了解TEXT_BASE:
U-BOOT编译时设定的内核映像连接起始地址,即假设U-BOOT是要放置在TEXT_BASE地址起始处的
通常TEXT_BASE是RAM地址,因为通常U-BOOT是在RAM中运行的
因此,
通过判断r0与TEXT_BASE的值是否相同,即可判断是在FLASH还是SDRAM中了
汇编如下:
adr r0,_start -- c700108: e24f0e11 sub r0, pc, #272 ; 0x110
ldr r1,TEXT_BASE -- c70010c: e51f1034 ldr r1, [pc, #-52] ; c7000e0 <_TEXT_BASE>
cmp r0,r1 c700110: e1500001 cmp r0, r1
|