ARM 汇编第一阶段引导加载概念

问题描述

我将编写一个第一阶段的引导加载程序,它将固件从闪存直接加载到 RAM 中,在基于 Cortex A7 的处理器上使用 ARM 程序集。 我对如何做到这一点有一个基本的想法,但我不确定:

在闪存中固件的第一个指令字节之前,会有一个字指示固件的总长度(以字节为单位)。这个值将被加载到,比方说,r1,它将作为一个计数器。

然后我们将使用两个寄存器作为指针(比方说,r2 和 r3) r2 最初将与固件的第一个字节的地址一起加载到闪存中。 r3 最初将加载固件将被写入的 RAM 的第一个空闲字节的地址。 r4 将作为当前要传输的指令的临时存储。

我们现在准备传输固件:

loadLoop:
    LDR r4,[r2] ;grab instruction from flash
    STR r4,[r3] ;write it to RAM
    ADD r2,#4 ;increment flash pointer by 32 bit
    ADD r3,#4 ;increment RAM pointer by 32 bits
    SUB r1,#4 ;decrement counter by 32 bits
    CMP r1,#0 ;did we load all of the firmware?
    BNE loadLoop ;if not,keep going
otherCode:
... ;firmware is Now in place,init process can go on

我仍然是初学者,我知道这可能会遗漏一些步骤,但我的问题是,我的一般概念是否正确?

解决方法

是的,您的概念是正确的,根据哪个 arm 指令集,您可以将此循环简化为更少的指令。 (cortex-a7 你可以将 6 条指令组合成 3 条指令,让你总共有 4 条指令用于循环,不完全是一半......)如果你想要性能,你可以做其他优化。但这看起来很实用。