Programmer's Note

コード読み書きの備忘録。

ARMボードエミュ:Bare MetalでHello World

前にARMのbare metal programmingでタスクスイッチっぽいところまで作ったけど、また似たようなことをやりたくなった。 とりあえず、もう一回初めからメモ。

参照記事

Emulating ARM PL011 serial ports | Freedom Embedded

ソースコード

ほぼ参照記事の流用だけど。

arm_bare_metal_programming/00_hello_world at main · yenshan/arm_bare_metal_programming · GitHub

Mac OSでarmのクロスコンパイラのインストール

$ brew install arm-none-eabi-gcc
$ brew install arm-none-eabi-gdb

ビルド&実行

$ make
/opt/homebrew/bin/arm-none-eabi-gcc -c -Wall -nostdinc -nostdlib -fno-builtin -I. test.c
/opt/homebrew/bin/arm-none-eabi-gcc -c -Wall -nostdinc -nostdlib -fno-builtin -I. startup.s
/opt/homebrew/bin/arm-none-eabi-gcc -c -Wall -nostdinc -nostdlib -fno-builtin -I. serial.c
/opt/homebrew/bin/arm-none-eabi-gcc test.o startup.o serial.o -o test -Wall -nostdinc -nostdlib -fno-builtin -I. -static -T ld.scr -L.
/opt/homebrew/opt/arm-none-eabi-binutils/bin/arm-none-eabi-ld: warning: test has a LOAD segment with RWX permissions
cp test test.elf
/opt/homebrew/bin/arm-none-eabi-strip test
/opt/homebrew/bin/arm-none-eabi-objcopy -O binary test test.bin
$ ./run.sh
Hello, World!!!

表示されたのはいいが、QEMUから抜けるにはどうすれば良いのか。 とりあえず、ps ID調べてkillした。

QEMUと実機の違い

この記事によると、 Hello world for bare metal ARM using QEMU | Freedom Embedded

QEMULinuxのブートに特化していて、本来のARMのブートシーケンスのエミュレーションを端折っている。 0x00010000 にカーネルイメージをロードして実行する仕様。 なので自作のプログラムも0x00010000にロードされる前提で作る必要がある。 主に ld.scr の内容が影響される。 あと、割り込みベクターテーブルの設定もできないっぽい。

そこらへんも bare metalしたいととなると、実機しかないよな。