u-boot start.S中relocate自搬运部分分析,adr与ldr区别
来源:互联网 发布:知乎怎么查看问题 编辑:程序博客网 时间:2024/06/05 16:35
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://www.blogbus.com/coon-logs/2738861.html
adr r0, _start
ldr r0, =_start
nop
mov pc, lr
_start:
nop
编译的时候设置 RO 为 0x0c008000
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
0c008000 <_start-0x14>:
c008000: e59f000c ldr r0, [pc, #12] ; c008014 <_start> ;r0 = 0xe1a00000
c008004: e28f0008 add r0, pc, #8 ; 0x8 ; r0 = pc运行时地址+8; 即运行时_start的地址
c008008: e59f0008 ldr r0, [pc, #8] ; c008018 <_start+0x4>;r0 = 0xe1a00000
c00800c: e1a00000 nop (mov r0,r0)
c008010: e1a0f00e mov pc, lr
0c008014 <_start>:
c008014: e1a00000 nop (mov r0,r0)
c008018: 0c008014 stceq 0, cr8, [r0], -#80
分析:
ldr r0, _start
从内存地址 _start 的地方把值读入。执行这个后,r0 = 0xe1a00000
adr r0, _start
取 得 _start 的地址到 r0,但是请看反编译的结果,它是与位置无关的。其实取得的时相对的位置。例如这段代码在 0x0c008000 运行,那么 adr r0, _start 得到 r0 = 0x0c008014;如果在地址 0 运行,就是 0x00000014 了。
ldr r0, =_start
这 个取得标号 _start 的绝对地址。这个绝对地址是在 link 的时候确定的。看上去这只是一个指令,但是它要占用 2 个 32bit 的空间,一条是指令,另一条是 _start 的数据(因为在编译的时候不能确定 _start 的值,而且也不能用 mov 指令来给 r0 赋一个 32bit 的常量,所以需要多出一个空间存放 _start 的真正数据,在这里就是 0x0c008014)。
因此可以看出,这个是绝对的寻址,不管这段代码在什么地方运行,它的结果都是 r0 = 0x0c008014
===================================================================
relocate:/* relocate U-Boot to RAM自拷贝代码 */
adr r0, _start/* r0 <- current position of code (此处r0取决于运行实际所处的_start地址)*/
ldr r1, _TEXT_BASE/* test if we run from flash or RAM (此处r1为_TEXT_BASE宏定义的值)*/
cmp r0, r1 /* don't reloc during debug */
beq stack_setup/*如果相等,说明uboot已经被搬运到期望的_TEXT_BASE定义的地址*/
/*TEXT_BASE = 0x41008000 在board/xxx/xxx_board/config.mk定义*/
/*求 boot代码大小*/
ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2/* r2 <- size of armboot */
add r2, r0, r2/* r2 <- source end address */
copy_loop: /* 自搬运*/
ldmia r0!, {r3-r10}/* copy from source address [r0] */
stmia r1!, {r3-r10}/* copy to target address [r1] */
cmp r0, r2/* until source end addreee [r2] */
ble copy_loop
- u-boot start.S中relocate自搬运部分分析,adr与ldr区别
- u-boot start.S中relocate部分分析,adr与ldr区别
- TQ2440之uboot---6.start.S中relocate部分分析,adr与ldr区别
- bootloader---7.start.S中relocate部分分析,adr与ldr区别
- 结合U-boot源码中的重定位reloccate分析ARM汇编指令中ldr和adr指令区别
- ldr与adr区别
- U-BOOT源码中start.S分析
- 由ADR/LDR看U-boot结构
- U-BOOT start.S分析
- u-boot分析--start.s
- u-boot start.s 分析
- U-BOOT start.S分析
- ldr与adr的区别
- ldr与adr的区别
- adr与ldr的区别
- ldr与adr的区别
- LDR与ADR的区别
- adr 与 ldr 的区别
- Sicily 1912. Crop circles
- 面试题之闭包
- SPI bus
- Linux如何给单用户模式设置密码?
- android进程间通信-aidl的使用
- u-boot start.S中relocate自搬运部分分析,adr与ldr区别
- android的ShapeDrawable源码解析
- 记录
- [转]窗口之间的主从关系与Z-Order
- pxc测试机搭建过程
- 使用GET和POST提交数据
- 删除本地多个文件后,怎样恢复
- C语言100个经典的算法
- 2015年3月13日工作总结