Raspberry Pi 3で64bitモード(AArch64)のベアメタル動作を目指す
参考となる情報をまとめておく
ブートプロセスの概略
SoCのブート
(準備)Raspberry PiのSDカードにbootcode.bin、start.elf、config.txt、プログラム本体を置いておく
- Raspberry Piに電源を入れるとまずGPUが起動する
ARMのプロセッサはoff、SDRAMも無効な状態になっている - GPUはブートローダーを実行開始する
このブートローダーはROMにマスクされている
SDカードから2段目のブートローダー(bootcode.bin)をキャッシュに読み込む - GPUは2段目ブートローダー(bootcode.bin)を実行をする
SDRAMを有効にする
SDカードからファームウェア(start.elf)を読み込む - GPUはstart.elfを実行する
SDカードからconfig.txt、プログラム本体を読み込む
config.txtの内容に沿ってCPUのブート設定が行われる
つまり、ユーザはconfig.txtの内容を変更することでCPU起動パラメータをいじることができる
プログラム本体はデフォルトでSDRAMのアドレス0x8000に配置される
config.txtの設定によっては0x0番地に配置することもできる
start.elfはARMプロセッサをリセットする - ARMプロセッサがSDRAMに置かれたプログラム本体を実行開始する
ARMプロセッサのブート
後述のconfig.txtで64bitモード起動を指定すると、
ARMプロセッサは以下のような状態でブートを開始する
- config.txtの内容に従って0x8000番地 or 0x0番地から実行開始
- Exception LevelはEL3 Secureの状態
- キャッシュ、MMUはoff
- JTAG機能はoff(JTAGを使う場合はレジスタ設定が必要)
用意するファイル
Raspberry Piをベアメタル動作するには、FAT32フォーマットしたSDカードに以下を置く。
- bootcode.bin
- start.elf
- config.txt
- my_program.bin(プログラム本体、名前は何でも良い)
bootcode.bin、start.elfは以下からDLする。
https://github.com/raspberrypi/firmware/tree/master/boot
config.txtは自分で記述する。
my_program.binはプログラム本体で、自分で作成する。
バイナリ形式である。elf形式ではない。
config.txtの記述
通常は以下のような内容のconfig.txtを用意する
kernel=my_program.bin
arm_control=0x200
kernel_old=1
disable_commandline_tags=1
-
kernel=my_program.bin
動作させたいプログラム本体の名前を指定する。
指定しない場合、デフォルトでkernel.imgだったりkernel7.imgだったりをロードする。 -
arm_control=0x200
これでARMコアがAArch64で起動する。
arm_control=0x0
とするとAArch32で起動する。指定しなくてもAArch32になる。 - kernel_old=1
0x0番地からプログラムを実行する。
これを指定しないと0x8000番地からプログラムを実行する。
u-bootは0x8000番地にプログラムを展開する前提で作られているらしく、
u-bootを使わないならkernel_old=1を指定するのが良い? - disable_commandline_tags=1
これを指定しないと、boot loaderがATAGSというタグ情報を0x100番地に上書きしてしまうらしい?
プログラム本体(my_program.bin)の用意
バイナリ形式のプログラム本体を作成する。
コンパイラは、以下のLinaroのAArch64 Bare-Metal用GCCが使える。
https://www.linaro.org/downloads/
プログラム本体のサンプルプログラムは後日投稿する。
Raspberry Piの起動
上記で用意した以下4つのファイルをFAT32フォーマットしたSDカードに以下を置く。
- bootcode.bin
- start.elf
- config.txt
- my_program.bin(ファイル名はconfig.txtで指定)
Raspberry Piに電源を接続して起動する
参考情報
- SoCの仕様
- Raspberry Pi 3の仕様
https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2837/README.md - Raspberry Pi 2 Model Bの仕様
https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2836/README.md - Raspberry Pi Model A, B, B+, Zeroの仕様
https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2835/README.md
- Raspberry Piのピン配置
https://www.raspberrypi.org/documentation/usage/gpio-plus-and-raspi2/README.md
https://i1.wp.com/www.pighixxx.com/test/wp-content/uploads/2015/06/raspberry.png - config.txtのオプション
https://www.raspberrypi.org/documentation/configuration/config-txt/README.md
http://elinux.org/RPiconfig - Raspberry PiのブートFW
https://github.com/raspberrypi/firmware/tree/master/boot - LinaroのAArch32/AArch64用コンパイラ
https://www.linaro.org/downloads/ - Raspberry Pi 3をAArch64で動かす方法に関するやり取り
https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=137963&hilit=aarch64 - Raspberry Pi 3 AArch64 JTAG用のOpenOCD
https://github.com/daniel-k/rpi3-aarch64-jtag - Raspberry Pi、ベアメタル、AArch64関連の投稿
http://d.hatena.ne.jp/cupnes/20160529/1464513206
http://blog.livedoor.jp/suoyimi/archives/53217019.html
http://domisan.sakura.ne.jp/article/rp_toppers/rp_toppers.html
http://tanehp.ec-net.jp/heppoko-lab/prog/qemu_arm/qemu-arm64.html
http://asmichi.hatenablog.com/entry/2014/08/15/203057 - EclipseとOpenOCDの連携
http://www48.atpages.jp/~cent22/Electronics/STM32/DevelopEnv_DebuggerEclipse/DevelopEnv_DebuggerEclipse.html