BloathX 发表于 2022-4-29 22:13:33

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

luhuaren 发表于 2022-4-29 22:24:50

ldr和adr的含义不一样,一个是装入绝对地址,一个是装入相对地址,生成和地址无关的代码就要用adr,理解一下代码加载域和运行域,分散加载的原理

BloathX 发表于 2022-4-29 23:27:04

luhuaren 发表于 2022-4-29 22:24
ldr和adr的含义不一样,一个是装入绝对地址,一个是装入相对地址,生成和地址无关的代码就要用adr,理解一下 ...
(引用自2楼)

嗯, 感谢回答, 我明白原理

就是没看懂, 这里明明是还在SRAM中执行的, 还没开始relocate_code, 为什么这里LR的值通过ADR被赋予了here的链接地址, 而非当前运行地址(SRAM中)

luhuaren 发表于 2022-4-30 06:16:25

为了生成和地址无关的代码

abutter 发表于 2022-4-30 06:55:49

你要看是取链接地址还是运行时地址。
页: [1]
查看完整版本: u-boot重定位中adr指令的疑惑