首页 > 解决方案 > ARMv8:我可以从 BL1 内跳转到另一个地址吗?

问题描述

更新:这是因为 MMU 内存属性设置。我手动将该0x8000~0x9000区域添加MT_CODE为 BL1 的静态内存区域之一(在启用 MMU 之前),然后它工作正常。


我是 ARM 的新手。不知何故,我想从 BL1 中跳转到另一个地址(比如),方法是在调用之后0x8000添加两行代码:bl1_entrypointbl_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指令处停止。

如果我将地址更改0x80000x0,则预期 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。经过测试,这可以按预期工作,因为两个断点 (0x00x8000) 可以永远交替命中。

BL1“跳”到BL2的机制对我来说有点复杂。我只想知道为什么上面描述的场景不起作用。

谢谢。

标签: assemblyarmv8

解决方案


推荐阅读