簡體   English   中英

如何為Raspberry Pi 3編譯ARMv8代碼

[英]How to compile ARMv8 code for Raspberry pi 3

我一直在這里的教程為樹莓派編程一個基本的操作系統。 我已經閱讀了文檔並更改了寄存器,以便它們可以運行,但是由於raspberry pi 3是64位的,因此使用ARMv8時lsl越界。 我使用的是Mac,因此使用的是YAGARTO,但我真的不知道如何或在何處獲得另一個64位編譯器。

有興趣的人的代碼:

.section .init
.globl _start
_start:

ldr r0,=0x3f200000


mov r1,#1
lsl r1,#21
str r1,[r0,#16]


mov r1,#1
lsl r1,#47
str r1,[r0,#28]

loop$: 
b loop$

我建議在這里查看David Welch的RaspberryPi 3的aarch64示例。 為了方便起見,他的引導程序允許以.hex格式上傳文件。
作為記錄,您可以使用以下命令從編譯的可執行文件中創建一個.hex:

aarch64-none-objcopy program.elf -O ihex example.elf example.hex

關於工具鏈,據我所知,Linaro和ARM僅提供Linux和mingw的工具鏈。 但是,你可以使用由OSX,個人建工具鏈,如這一個由塞爾吉奧·貝尼特斯提供。

更新:一種方便的替代方法是,根據此處所述的出色步驟,在您的SD卡上安裝u-boot。

假設您將在/ opt中安裝了aarch64-none工具鏈,因此aarch64-none-gcc的路徑為:

/opt/aarch64-none/bin/aarch64-none-gcc

滿足您需求的簡化程序為:

在SD卡上創建一個最小的config.txt,

enable_uart=1
arm_control=0x200
kernel=u-boot.bin

bootcode.binfixup.datstart.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>

bootdelay環境變量設置為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>

如果輸入reset命令,則pi將重新啟動,但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,僅hello-aarch64.srec文件)。

## First Load Addr = 0x00200000
## Last  Load Addr = 0x00200067
## Total Size      = 0x00000068 = 104 Bytes
## Start Addr      = 0x00200000
U-Boot>

使用go從u-boot命令執行程序(該go的命令實際上是call一個)。

U-Boot> go 0x00200000
## Starting application at 0x00200000 ...
Hello, aarch64 bare-metal world!
## Application terminated, rc = 0x0
U-Boot>

就是這樣,您現在應該有一個很好的標准環境來學習aarch64匯編語言。

抱歉,它很冗長,但目的是為需要的人提供一個簡單而完整的過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM