Raspberry Pi3(Linux Kernel)のBoot Sequence Step1:アーキテクチャ依存部
前書き
シングルボードコンピュータの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 |
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プロセス)を起動
参考
Raspberry PI bare metal Part 1: The Boot Process
ロシア人と国際結婚した地方エンジニア。
小学〜大学院、就職の全てが新潟。
大学の専攻は福祉工学だったのに、エンジニアとして就職。新卒入社した会社ではOS開発や半導体露光装置ソフトを開発。現在はサーバーサイドエンジニアとして修行中。HR/HM(メタル)とロシア妻が好き。サイトに関するお問い合わせやTwitterフォローは、お気軽にどうぞ。