assembly - ARMv8:我可以从 BL1 内跳转到另一个地址吗?
问题描述
更新:这是因为 MMU 内存属性设置。我手动将该0x8000~0x9000
区域添加MT_CODE
为 BL1 的静态内存区域之一(在启用 MMU 之前),然后它工作正常。
我是 ARM 的新手。不知何故,我想从 BL1 中跳转到另一个地址(比如),方法是在调用之后0x8000
添加两行代码:bl1_entrypoint
bl_main
bl bl1_main
mov x0, #0x8000
br x0
但是,该br
指令似乎导致系统挂起。
我还尝试bl1_main.c
通过添加一个函数来添加跳转jump()
,并在输入后调用它bl1_main()
:
void jump(void)
{
NOTICE("BL1: entering jump()...\n");
console_flush();
asm volatile ("mov x20, #0x8000\n");
asm volatile ("br x20\n");
}
正如通过 JTAG 测试的那样,它也在br
指令处停止。
如果我将地址更改0x8000
为0x0
,则预期 BL1 将继续重复引导的行为。
如果我将地址更改0x8000
为 jump() 的地址(0xb00
通过检查bl1.dump
),它也会按预期运行。
我有点困惑为什么它不能跳得更远(此外0x8000
,我也试过0x5000
哪个也不起作用)。
我放在 0x8000(或 0x5000)的代码是一个类似的跳转代码rom_trampoline.o
(将目标地址更改为0x0
)。我的目标是测试 BL1 跳转到0x8000
,然后跳转回0x0
... 的行为,并且代码永远来回跳转。
jump()
在 JTAG 调试器中,如果我在( )处设置断点0xb00
,它将在 处停止0xb00
,指向movz x20, #0x8000
指令,然后是br x20
指令。如果我跳过这条指令,JTAG 调试将断开与 FPGA 目标的连接,并在其状态栏中报告“错误 - 失败的 asm stepin ! - 未知错误 (0x00000002)”。这也是出乎意料的,因为在开始时(在地址处0x0
),我可以跳过指令,而且mov
指令似乎无害......
我还测试了两个蹦床代码(即不涉及 BL1):放置一个0x0
跳到 的蹦床0x8000
,然后放置另一个0x8000
跳到 的蹦床0x0
。经过测试,这可以按预期工作,因为两个断点 (0x0
和0x8000
) 可以永远交替命中。
BL1“跳”到BL2的机制对我来说有点复杂。我只想知道为什么上面描述的场景不起作用。
谢谢。
解决方案
推荐阅读
- swift - 如何将 Python HMAC 请求翻译成 Swift
- user-interface - 如何恢复到旧的 Azure 逻辑应用 UI?
- typescript - 如何使用 Pick<> typescript 访问嵌套文件
- php - 如何使用 php 从 mySQL DB 中的两个表中添加非空值?
- javascript - 从包含其他文本的 Google 表格单元格中提取 URL 链接
- spring - 依赖预先存在的数据的硒测试,弹簧启动?
- javascript - 功能代码在缩小和部署后不再工作
- python - 按字典中的列表分组
- python - 从 Tkinter 按钮保存和加载文件
- javascript - 将代理对象作为 thisArgument 传递以应用抛出 TypeError: Illegal Invocation