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 上编写一个最小的裸机组装程序。