当链接地址跟加载地址不一致时,将代码拷贝至链接地址处,并跳转到目标链接地址去执行,这样实现的一个好处是可以将boot加载到任意地址去执行,由boot自行搬移到链接地址,实现代码如下,boot入口函数,cpu为mips:
LEAF(_start)
#if 1 // relocation
bal set_ra
// nop
1:
move t0, ra
la t1, _start
la t2, 1b
subu t2, t2, t1
subu t0, t0, t2
move a0, t0
la a1, _start
subu t0, t0, a1
beqz t0, 2f
nop
la a2, _end
subu a2, a2, a1
bal move_code
nop
/* clear d cache */
bal clear_all_d_cache
nop
/* clear i cache */
bal invalidate_all_i_cache
nop
#if 0
li a0, 'R'
bal _writeasm
nop
#endif
la a0, 2f
jr a0
nop
2:
#endif
LEAF(move_code)
1:
lw v0, 0(a0)
addiu a2, a2, -4
sw v0, 0(a1)
addiu a0, a0, 4
addiu a1, a1, 4
bnez a2, 1b
nop
jr ra
nop
END(move_code)
LEAF(set_ra)
jr ra
nop
END(set_ra)