boot可加载到任意地址执行的方法

4 篇文章 0 订阅

当链接地址跟加载地址不一致时,将代码拷贝至链接地址处,并跳转到目标链接地址去执行,这样实现的一个好处是可以将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)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值