01

はじめに

Githubで公開されている,GitHub - bztsrc/raspi3-tutorial: Bare metal Raspberry Pi 3 tutorialsのコードを読んでいく.今回は01_bareminimumの無限ループを理解することを目的とする.

登場ファイル:start.S, link.ld, Makefile
キーワード:アセンブリ言語,無限ループ

アセンブリ言語ソースファイル(start.S)

.section ".text.boot"

.global _start

_start:
1:  wfe
    b       1b
  • 拡張子.sと拡張子.Sの違い?

*.sの場合は,アセンブル時にプリプロセスが行われない.
*.Sの場合は,アセンブル時にプリプロセスが行われる.
(今回はインクルードやマクロを使用しないためstart.sで良い気がする)

  • .section命令?

次の.section命令までを".text.boot"セクションと指定
今回は次の.section命令が出てこないので,すべて.text.bootセクションに指定

  • .global命令?

指定したラベルを外部から参照可能にする

  • wfe命令?

割込みなどのイベントが発生するまで実行を保留?
(今回はイベントが起こらないから,実行を保留していたらループしないのでは?)
詳細は割込みなどを扱う回でもう一度調べよう

  • b命令?

無条件分岐命令.
1bは1beforeの意味で直前の1ラベルを示している.

リンカスクリプト(link.ld)

SECTIONS
{
    . = 0x80000;
    .text : { *(.text.boot) }

   /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) }
}
  • . = 0x*?

「. 」はロケーションカウンタと呼ばれ,カレントアドレスを指定する
この指定により.textセクションが0x8000直後に配置される

  • .text : { *(.text.boot) }?

リンク前のオブジェクトファイルの.text.bootセクションを,リンク後のオブジェクトファイルの.textセクションに再配置する

  • /DISCARD/?

指定したセクションは,リンクによりに再配置しない,つまり捨ててしまう
(後の回で,.commentセクションや.gnu*セクションが出てくるのだろうか?今回はこれがなくても結果は変わらない)

Makefile

CFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles

all: clean kernel8.img

start.o: start.S
	aarch64-elf-gcc $(CFLAGS) -c start.S -o start.o

kernel8.img: start.o
	aarch64-elf-ld -nostdlib -nostartfiles start.o -T link.ld -o kernel8.elf
	aarch64-elf-objcopy -O binary kernel8.elf kernel8.img

clean:
	rm kernel8.elf *.o >/dev/null 2>/dev/null || true

run:
	qemu-system-aarch64 -M raspi3 -kernel kernel8.img -d in_asm

・-ffreestanding ... フリースタンディング実行環境用に コンパイルを行う.つまり-fno-builtinオプションが有効となり,mainがなくてもよくなる
・-nostdinc ... ヘッダファイルのための,標準システムディレクトリ検索をしない
・-nostdlib ... リンク時に,標準のシステムライブラリとスタートアップファイルを使用しない
・-nostartfiles ... リンク時に,標準ライブラリは使用するが,標準のスタートアップファイルは使用しない
(今回は-nostdlibオプションを使用しているので-nostartfilesは不要な良い気がする)

  • objcopy -O binary?

ELF のヘッダ等を取り払い、Raw バイナリに変換