【发布时间】:2021-02-06 02:15:16
【问题描述】:
在带有 BLR 的 64arm 中使用其绝对地址 (0x80904) 跳转到 C 函数失败:
LDR x3, =0x80904
SUB x0, x3, x19
BL print_x0 // Prints something to uart, i.e, x0 == x19
BLR x19 // Fails!
地址不错:BLR x3 有效。
x19 值在print_x0 之后没有变化。我测试过了。
为什么分支会产生这个异常?
谢谢!
【问题讨论】:
-
根据页表或任何其他内存保护设置,该代码地址是否在可执行内存中?
-
sp也有效吗?不知道这是否会导致同样的异常。 -
如果
esr_el1的最低6位可以信任,那么根据手册,这将是“地址大小错误,翻译或翻译表基址寄存器的0级”,建议您的页表映射到超出范围的物理地址......否则我同意@Jester:makie确保sp有效,并另外检查您是否启用了SP对齐检查(如果是,请确保SP实际上是16字节对齐)。 -
anotherFunc有没有可能搞砸了堆栈?无论如何,如果您有办法制作一个,在blr x19的站点上进行寄存器转储似乎很有用。 -
这并没有什么帮助——它们都会给出
function的“预期”地址,而不是你最终跳转到的位置。如果你从绝对地址0x80904中转储几个字,看看它们是否与函数的机器码匹配?
标签: assembly arm64 osdev bare-metal