LoginSignup
41
37

More than 5 years have passed since last update.

Raspberry Pi 3の64bitモード、ベアメタルに関する情報を書き溜めておく

Last updated at Posted at 2017-04-16

Raspberry Pi 3で64bitモード(AArch64)のベアメタル動作を目指す

参考となる情報をまとめておく

ブートプロセスの概略

SoCのブート

(準備)Raspberry PiのSDカードにbootcode.bin、start.elf、config.txt、プログラム本体を置いておく

  1. Raspberry Piに電源を入れるとまずGPUが起動する
    ARMのプロセッサはoff、SDRAMも無効な状態になっている
  2. GPUはブートローダーを実行開始する
    このブートローダーはROMにマスクされている
    SDカードから2段目のブートローダー(bootcode.bin)をキャッシュに読み込む
  3. GPUは2段目ブートローダー(bootcode.bin)を実行をする
    SDRAMを有効にする
    SDカードからファームウェア(start.elf)を読み込む
  4. GPUはstart.elfを実行する
    SDカードからconfig.txt、プログラム本体を読み込む
    config.txtの内容に沿ってCPUのブート設定が行われる
    つまり、ユーザはconfig.txtの内容を変更することでCPU起動パラメータをいじることができる
    プログラム本体はデフォルトでSDRAMのアドレス0x8000に配置される
    config.txtの設定によっては0x0番地に配置することもできる
    start.elfはARMプロセッサをリセットする
  5. 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を用意する

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に電源を接続して起動する

参考情報

  1. SoCの仕様
  2. 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
  3. config.txtのオプション
    https://www.raspberrypi.org/documentation/configuration/config-txt/README.md http://elinux.org/RPiconfig
  4. Raspberry PiのブートFW
    https://github.com/raspberrypi/firmware/tree/master/boot
  5. LinaroのAArch32/AArch64用コンパイラ
    https://www.linaro.org/downloads/
  6. Raspberry Pi 3をAArch64で動かす方法に関するやり取り
    https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=137963&hilit=aarch64
  7. Raspberry Pi 3 AArch64 JTAG用のOpenOCD
    https://github.com/daniel-k/rpi3-aarch64-jtag
  8. 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
  9. EclipseとOpenOCDの連携
    http://www48.atpages.jp/~cent22/Electronics/STM32/DevelopEnv_DebuggerEclipse/DevelopEnv_DebuggerEclipse.html
41
37
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
37