Raspberry Pi 3 Model Bのブート周り

はじめに

ラズパイ3で動くOSを自作するために必要な情報を収集中.基本的に必要な情報はラズパイ公式のドキュメントに書いているみたいだけど,散らばってるし,英語だしよくわからんってことでまとめてみた.

BCM2837

まずはハードウェアについて.BCM2837 - Raspberry Pi Documentationによるとラズパイ3はBCM2837というSoCを積んでいる.そしてVideoCore - WikipediaによるとBCM2837には

  • GPU ... VideoCore 4
  • CPU ... Cortex-A53, 4コア

が含まれている.

ブートプロセス

SoCにはGPUとCPUが含まれていることがわかったので,そのSoCのブートプロセスについて調べる.公式のドキュメントは見つけられなかったので,What is the boot sequence? - Raspberry Pi Stack ExchangeRPi Software - eLinux.orgを参考にする.ブートは次に示す通り,段階的に行われるみたい.

(準備)SDカードにbootcode.bin,start.elf,config.txt,kernel.imgを置いておく(config.txtはオプショナル?)

  1. ラズパイ3に電源を入れる.
  2. GPUが起動.(このときCPUはオフ、SDRAMは無効な状態になっている.)
  3. GPUはSoC内のROMから第1段ブートローダを実行する.(第1段ブートローダはラズパイ製造時にSoC内のROMに書き込まれている.)
  4. 第1段ブートローダ
  5. 第2段ブートローダ
  6. GPUファームウェア
    • SDカードから,config.txtを読み,CPUの設定を行う.
    • SDカードから,カーネルイメージ(kernel.img)を読み,SDRAMにロード.
    • CPUのリセット信号を有効にする.
  7. CPUがSDRAMに置かれたプログラムを実行する.(CPUからGPUに処理が移る)

fixup.datというファイルをSDカード上に用意しておくと,GPUとCPU間のSDRAMパーティションの設定を行えるようだけど,詳細は不明.ファイルもバイナリなので,このファイルについては保留.

config.txt

ブートプロセスに登場するconfig.txtとは何ぞや?ということで調べてみると,ラズパイにはBIOSがないためconfig.txtで様々な設定を行うみたい.config.txt - Raspberry Pi Documentationより,ブートに関する設定の一部を以下にまとめる.

  • kernel = ファイル名

ロードするカーネルを指定.デフォルトでは,ラズパイ3の場合kernel7.imgがロードされる.kernel8.imgが(ブートパーティションに)ある場合は,優先的にそれがロードされCPUは64ビットモードに設定される.
注意:圧縮されてないカーネルイメージファイルでなければならない

  • kernel_address = メモリアドレス

カーネルイメージをロードするメモリアドレスを指定.デフォルトでは,32ビットカーネルの場合0x8000に,32ビットカーネルの場合0x80000にロードされる.

  • kernel_old = 1

kernel_oldを1にするとカーネルイメージはメモリアドレス0x0にロードされる.

  • arm_64bit

これを設定すると、CPUは64ビットモードになる.kernel8.imgを使用すれば,この設定はなくてもよさそう.