Я бы предложил взглянуть на примеры aarch64 Дэвида Уэлча для RaspberryPi 3 здесь .Его загрузчик позволяет загружать файлы в формате .hex для удобства.Для записи вы можете создать .hex из скомпилированного исполняемого файла, используя следующую команду:
aarch64-none-objcopy program.elf -O ihex example.elf example.hex
Что касается цепочки инструментов, Linaro и ARM, насколько я знаю, предоставляют только цепочки инструментов для Linux и mingw.Но вы можете использовать наборы инструментов, созданные отдельными лицами для OSX, такие как , этот , предоставленный Sergio Benitez.
Обновление: удобной альтернативой может быть установка u-boot на вашу SD-карту на основе превосходной процедуры, описанной здесь .
Предполагается, чтов / opt должен быть установлен набор инструментов aarch64-none, поэтому путь к aarch64-none-gcc будет:
/opt/aarch64-none/bin/aarch64-none-gcc
Упрощенная процедура, подходящая для ваших нужд, будет:
Создание минимального config.txt на вашей SD-карте,
enable_uart=1
arm_control=0x200
kernel=u-boot.bin
Копирование bootcode.bin , fixup.dat и start.elf на SD-карту,
Сборка u-boot,
wget ftp://ftp.denx.de/pub/u-boot/u-boot-2019.01.tar.bz2
tar Jxf u-boot-2019.01.tar.bz2
cd u-boot-2019.01
make CROSS_COMPILE=/opt/aarch64-none/bin/aarch64-none- ARCH=arm64 rpi_3_defconfig all
Копирование u-boot.bin на SD-карту - теперь оно должно содержать следующие файлы:
2019-04-08 06:03 PM 108 config.txt
2019-04-08 04:11 PM 2,873,444 start.elf
2019-04-08 04:11 PM 52,296 bootcode.bin
2019-04-08 04:11 PM 6,701 fixup.dat
2019-04-08 04:08 PM 479,872 u-boot.bin
Установка SD-карты в Raspberry-pi3, при условии, что у вас установлен ключ последовательного интерфейса к USB и эмулятор терминала настроен на использование последовательного порта USB со следующими настройками:
115200 bps, 8 data bits, 1 stop bit, no parity, no hardware flow control
Теперь вы можете включить устройство и нажать CTRL+C
как можно скорее, чтобы прервать процесс загрузки:
U-Boot 2019.01 (Apr 08 2019 - 16:07:23 -0400)
DRAM: 948 MiB
RPI 3 Model B (0xa22082)
MMC: mmc@7e202000: 0, sdhci@7e300000: 1
Loading Environment from FAT... *** Warning - bad CRC, using default environment
In: serial
Out: vidconsole
Err: vidconsole
Net: No ethernet found.
starting USB...
USB0: scanning bus 0 for devices... 3 USB Device(s) found
scanning usb for storage devices... 0 Storage Device(s) found
Hit any key to stop autoboot: 0
U-Boot> <INTERRUPT>
Переменная среды загрузки установлена на 2(в секундах), вам нужно установить его на -1 (бесконечно), чтобы избежать использования CTRL+C
при каждой загрузке:
U-Boot> printenv bootdelay
bootdelay=2
U-Boot> setenv bootdelay -1
U-Boot> saveenv
Saving Environment to FAT... OK
U-Boot>
Если вы введете команду сброса, пи перезагрузится, ноu-boot остановится:
U-Boot> reset
resetting ...
U
‡t-Boot 2019.01 (Apr 08 2019 - 16:07:23 -0400)
DRAM: 948 MiB
RPI 3 Model B (0xa22082)
MMC: mmc@7e202000: 0, sdhci@7e300000: 1
Loading Environment from FAT... OK
In: serial
Out: vidconsole
Err: vidconsole
Net: No ethernet found.
starting USB...
USB0: scanning bus 0 for devices... 3 USB Device(s) found
scanning usb for storage devices... 0 Storage Device(s) found
U-Boot>
Теперь вы можете использовать все доступные команды u-boot для проверки / изменения памяти и загрузки / выполнения программы:
Создайте файл с именем hello-aarch64.s
со следующим содержимым:
.title "hello-aarch64.s"
.arch armv8-a
.equ AUX_MU_IO_REG, 0x3F215040
.equ AUX_MU_LSR_REG, 0x3F215054
.text
.section .text.startup,"ax"
.globl Reset_Handler
Reset_Handler: stp x29, x30, [sp, #-16]!
adr x19, msg
ldr x20,= AUX_MU_IO_REG
ldr x21,= AUX_MU_LSR_REG
loop: ldrb w0, [x19], 1
cbz w0, done
wait: ldrb w1, [x21]
tbz w1, #5, wait
strb w0, [x20]
b loop
done: ldp x29,x30, [sp], #16
ret
.balign 16
msg: .asciz "Hello, aarch64 bare-metal world!\r\n"
.end
Поскольку мы будем вызывать программу из u-boot и не хотим ее аварийно завершать, программа должна соответствовать стандарту ARM Процедура вызова для64-битная архитектура ARM - это несколько излишне, потому что мы не вызываем какую-либо функцию, но это не имеет значения.
Программа может быть скомпилирована и файл s-записи создан с использованиемследующие команды:
CROSS_COMPILE= /opt/aarch64-none/bin/aarch64-none-
AS=${CROSS_COMPILE}as
LD=${CROSS_COMPILE}ld
OBJCOPY=${CROSS_COMPILE}objcopy
OBJDUMP=${CROSS_COMPILE}objdump
${AS} -o hello-aarch64.o hello-aarch64.s
${LD} -e Reset_Handler --section-start .text=0x00200000 -Map=hello-aarch64.map -o hello-aarch64.elf hello-aarch64.o
${OBJCOPY} hello-aarch64.elf -O srec hello-aarch64.srec
Теперь можно загружать и запускать программу: введите в u-boot следующую команду:
U-Boot> loads
## Ready for S-Record download ...
Из эмулятора терминала отправьте файл hello-aarch64.srec
в u-boot (без x-modem, без kermit, только файл как есть).
## First Load Addr = 0x00200000
## Last Load Addr = 0x00200067
## Total Size = 0x00000068 = 104 Bytes
## Start Addr = 0x00200000
U-Boot>
Используйте команду go
из u-boot для выполнения вашей программы (команда go
на самом деле call
one).
U-Boot> go 0x00200000
## Starting application at 0x00200000 ...
Hello, aarch64 bare-metal world!
## Application terminated, rc = 0x0
U-Boot>
Вот и все, теперь у вас должна быть отличная и стандартная среда для изучения языка ассемблера aarch64.
Извините, что многословно, но цель состояла в том, чтобы предоставить минималистский, но полныйпроцедура для людей, которым она понадобится.