Chinaunix首页 | 论坛 | 博客
  • 博客访问: 178799
  • 博文数量: 29
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 241
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-13 18:33
文章分类

全部博文(29)

文章存档

2014年(11)

2013年(18)

我的朋友

分类: 嵌入式

2014-03-08 16:46:02

这几天一直在搞手上的板子,看u-boot源码时再看代码搬移那段代码时遇到了问题,总觉得adr r0, _start 中r0的地址与ldr r2, _armboot_start 中r2的地址值应该是同一个值,但是这样理解就会跟后面的代码产生矛盾。感觉到了自己的理解有误就去网上搜了资料,可是说的都不是很清楚。今天才真正的弄明白了,是我一开始对PC寄存器的理解就不清晰,PC是指向当前程序的运行的地址,并不一定是代码连接的地址(因为代码在u-boot初期还没有搬移到链接地址去)。
adr r0, _start 汇编代码是:33d000a4: e24f00ac sub r0, pc, #172 ; 0xac。所以最终在r0中的值应该是PC - 172;PC = 当前代码地址+8即A4+8;r0中的值为0x0。
ldr r2, _armboot_start 是将标签_armboot_start地址中的值也就是_start地址放入r2中,_start的地址是在连接脚本中就指定好了的,也就是程序运行时“应该”位于的位置。
弄清楚了这三个地方,代码搬移的问题就迎刃而解了,还是基础不好啊
relocate: /* relocate U-Boot to RAM    */
adr r0, _start /* r0 <- current position of code   */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp     r0, r1                  /* don't reloc during debug         */
beq     clear_bss


ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2 /* r2 <- size of armboot            */
#if 1
bl  CopyCode2Ram /* r0: source, r1: dest, r2: size  */
#else

阅读(1544) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~