Сборка GNU на голом металле для модели основания ARMv8
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!
$
Обычно он выходит из командной строки. Я хочу написать минимальную программу сборки, которая может работать на голом металле, но я не знаю, как это сделать. Поэтому я разобрал hello.axf, используя набор инструментов linaro armv8, чтобы найти некоторые подсказки:
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.