2

ARM 发布了 ARMv8 仿真平台 Foundation Model。我根据linaro 网站上的指南设置环境。它可以支持裸机仿真,因为我尝试了示例 hello.axf 二进制文件

$ ./Foundation_v8pkg/Foundation_v8 --image ./Foundation_v8pkg/example/hello.axf
terminal_0: Listening for serial connection on port 5000
terminal_1: Listening for serial connection on port 5001
terminal_2: Listening for serial connection on port 5002
terminal_3: Listening for serial connection on port 5003
Simulation is started
Hello, 64-bit world!
$

它正常退出到命令行提示符。我想编写一个可以在裸机上运行的最小汇编程序,但我不知道该怎么做。因此,我使用linaro armv8 工具链对 hello.axf 进行了反汇编,以寻找一些线索:

aarch64-linux-gnu-objdump -S hello.axf

并获得退出子程序:

1663 00000000800017c8 <_sys_exit>:
1664     800017c8:   d10043ff        sub     sp, sp, #0x10
1665     800017cc:   d28004c1        movz    x1, #0x26
1666     800017d0:   f2a00041        movk    x1, #0x2, lsl #16
1667     800017d4:   f90003e1        str     x1, [sp]
1668     800017d8:   93407c00        sxtw    x0, w0
1669     800017dc:   f90007e0        str     x0, [sp,#8]
1670     800017e0:   910003e1        mov     x1, sp
1671     800017e4:   52800300        movz    w0, #0x18
1672     800017e8:   d45e0000        hlt     #0xf000
1673     800017ec:   14000000        b       800017ec <_sys_exit+0x24>

我编写了一个汇编文件 test.s ,其中仅包含退出片段:

.section .text, "ax"
.global _start
_start:
sub     sp, sp, #0x10                                                                                                  
movz    x1, #0x26
movk    x1, #0x2, lsl #16
str     x1, [sp]
sxtw    x0, w0
str     x0, [sp,#8]
mov     x1, sp
movz    w0, #0x18
hlt     #0xf000
b       .  

并使用以下方法构建它:

aarch64-linux-gnu-as test.s -o a.out
aarch64-linux-gnu-ld -Ttext=0x80000000 a.out -o test

运行它:

$ ./Foundation_v8pkg/Foundation_v8 --image test
terminal_0: Listening for serial connection on port 5000
terminal_1: Listening for serial connection on port 5001
terminal_2: Listening for serial connection on port 5002
terminal_3: Listening for serial connection on port 5003
Simulation is started

模拟器正在运行,但它不能像上面的 hello.axf 示例那样正常退出到命令行。对不起,冗长的描述。我的问题是如何在 ARMv8 Foundation Model 上编写一个最小的裸机组装程序。

4

0 回答 0