我正在写一个内核,我需要在0x7FFFFFFF之上进行自重定位。为此,我需要使用绝对寻址来引用内核的开始和结束以及一个符号,在重定位之后,执行将在那里继续。我一直无法找到任何方法来实现这一点。可以做到吗?有解决方法吗?
bis0qfac1#
我找到的唯一方法是取加载地址,然后从目标地址中减去这个值,然后将这个偏移量加到任何相对地址上,得到绝对地址。
3zwtqj6y2#
解决方法:在代码后放置一个64位常量(地址),然后通过“ld”指令获取地址。解决方法可编写如下:
# Use load instruction get address of _symbol ld t1, symbol_addr jr t1 ... # A large pc for _symbol _symbol: nop ... .data # symbol_addr equals to the address of _symbol symbol_addr: .dowrd _symbol
数据symbol_addr将被自动计算为_symbol的地址,该地址可能是一个大地址,然后使用“ld”指令加载symbol_addr,寄存器“t1”等于symbol_addr,“jr”指令将工作。类似的问题:在RISC-V 64中,如何通过绝对寻址加载符号的地址?
2条答案
按热度按时间bis0qfac1#
我找到的唯一方法是取加载地址,然后从目标地址中减去这个值,然后将这个偏移量加到任何相对地址上,得到绝对地址。
3zwtqj6y2#
解决方法:在代码后放置一个64位常量(地址),然后通过“ld”指令获取地址。解决方法可编写如下:
数据symbol_addr将被自动计算为_symbol的地址,该地址可能是一个大地址,然后使用“ld”指令加载symbol_addr,寄存器“t1”等于symbol_addr,“jr”指令将工作。
类似的问题:在RISC-V 64中,如何通过绝对寻址加载符号的地址?