u-boot重定位中adr指令的疑惑
在重定位之前, 有这么几句adr lr, here
ldr r0, /* r0 = gd->reloc_off */
add lr, lr, r0
ldr r0, /* r0 = gd->relocaddr */
b relocate_code
here:
在迁移后通过 bx lr直接跳转到DRAM中的uboot运行
我的疑惑是
adr lr here, lr应该是被赋值了here的链接地址, 加上偏移量, 就是实际运行的地址
但是adr指令查阅资料之后, 在这里应该是被赋值了在内部RAM中运行的地址, 我不太明白怎么搞得
u-boot版本是2018.03, cpu型号是cortex-A7 ldr和adr的含义不一样,一个是装入绝对地址,一个是装入相对地址,生成和地址无关的代码就要用adr,理解一下代码加载域和运行域,分散加载的原理
luhuaren 发表于 2022-4-29 22:24
ldr和adr的含义不一样,一个是装入绝对地址,一个是装入相对地址,生成和地址无关的代码就要用adr,理解一下 ...
(引用自2楼)
嗯, 感谢回答, 我明白原理
就是没看懂, 这里明明是还在SRAM中执行的, 还没开始relocate_code, 为什么这里LR的值通过ADR被赋予了here的链接地址, 而非当前运行地址(SRAM中)
为了生成和地址无关的代码 你要看是取链接地址还是运行时地址。
页:
[1]