g-bios 中断向量表和relocation技术的实现
g-bios中断向量表和relocation技术的实现
ldr r0, handle_reset - 4
adr r1, _start
cmp r0, r1
beq skip_move
ldr r2, [r1, #GBH_SIZE_OFFSET]
@ fixme
bl memmove
比较bh text开始的链接地址和其实际load到SDRAM中的物理地址,如若不想等,则把已经load到SDRAM的整个BH move到text的链接
地址对应的物理地址处,使物理地址和链接地址相一致,这样才能确保程序不会因为程序存在ldr pc, addr这样的绝对跳转指令而导致取址
不对(bl, b这样相对跳转指令无需物理地址和链接地址一致)
ldr pc, =skip_move
skip_move:
@ fixme for ROM
mov r0, #0
ldr r1, handle_reset - 4
cmp r1, r0
beq bss_init
mov r2, #(handle_reset - _start)
bl memcpy
检查bh看其是否被load 到0地址处,如果没有则把bh的中断向量表move 到0地址处,只有在0地址处(或者存在操作系统下的高地址处),
cpu在收到中断时才能够跳到中断向量表处跳转到相应位置执行相应中断函数(bh 的中断向量表在move 到0地址处后用ldr pc, adr依然能
够跳转到距离0地址相对较远的SDRAM处,因为ldr pc, addr是将addr 的链接地址给了pc,而这addr在经过relocation技术处理后物理地
址和链接地址一致,所以...)
ldr pc, [pc, #24]
ldr pc, [pc, #24]
ldr pc, [pc, #24]
ldr pc, [pc, #24]
.word (bss_begin - _start) @ for AT91SAM926X
ldr pc, [pc, #20]
ldr pc, [pc, #20]
.word GBH_MAGIC
.word handle_undef
.word handle_swi
.word handle_iabt
.word handle_dabt
.word handle_irq
.word handle_fiq
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
bh text开始的链接地址:在th中,指定的放置BH的地址
实际load到SDRAM中的物理地址:在lds脚本中,指定的BH的text的地址