01
はじめに
Githubで公開されている,GitHub - bztsrc/raspi3-tutorial: Bare metal Raspberry Pi 3 tutorialsのコードを読んでいく.今回は01_bareminimumの無限ループを理解することを目的とする.
アセンブリ言語ソースファイル(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 バイナリに変換