前書き
シングルボードコンピュータのRaspberry Pi3を用いて、Linux KernelのBoot Sequenceを調査します。その調査結果を複数回に分けて、記事にします。対象のLinux Kernelは、Raspberry Pi(OS)のソースコード rpi-4.1.yとします。
本記事では、電源投入からinitプロセスが立ち上がるまでを記載します。
Raspberry Piの起動に関わるソフトウェア
Raspberry Piに電源が投入された後、複数のBootloaderが実行されます。Bootloaderが多段の理由は、公式で情報がありません。推測ですが、バイナリサイズや起動コードの隠蔽が目的ではないかと考えています。
| 名称 | 格納先 | 役割 |
|---|---|---|
| Primary bootloader | SoC内ROM | bootcode.binをL2 cacheに読み込んだ後、 bootcode.binに制御を移す事 |
| bootcode.bin(※) | microSD (/boot/bootcode.bin) | start.elfをRAMへ読み込んだ後、 start.elfに制御を移す事 |
| start.elf | microSD (/boot/start.elf) | config.txt、cmdline.txtを読み込んだ後 kernel.img、Device Tree BlobをRAMに展開。 その後、kernel7.imgに制御を移す事。 |
| kernel7.img | microSD (/boot/kernel7.img) | Linux Kernelの初期化を実施した後、 systemd(initプロセス)を実行する事 |
| systemd | microSD (/lib/systemd/systemd) | 各種サービスを稼働した後、 コマンドプロンプト(shell)を実行する事 |
※2012年10月まで、start.elfを読み込むためのloader.bin(三段階目)が存在したが、削除された。参考:https://www.raspberrypi.org/forums/viewtopic.php?f=66&t=65022
起動シーケンスの概略
- 電源を投入
- GPU(Broadcom VideoCore IV)が起動
- GPUがSoCのROMからPrimary Bootloaderを読み込み、実行
- GPUがmicroSDからL2キャッシュにbootcode.binを読み込み、実行
- bootloader.bin内でGPU firmware(start.elf)を読み込む
- start.elf内でconfig.txt、cmdline.txtを読み込み、
- kernel7.imgとDTBを読み込む
- start.elf内でkernel7.img(Linux Kernel)のStart Addressに移動
- Linux Kernelが初期化プロセス(デバイスの初期化、Linux Kernelサブシステムの初期化など)を実行
- Linux Kernelがsystemd(initプロセス)を起動
