組み込みLinuxのブートチェーン
July 30, 2026 · – 訪問者
前回、USB経由でファームウェアを書き込む方法としてDFUについて書いた。あの記事では、それ自体で答える価値のある問いを飛ばしていた——電源ボタンを押してからシェルプロンプトが現れるまでの間に、実際には何が起きているのか?DFUはこの道筋から分岐する一本の枝にすぎないので、一度全体を通して歩いてみる価値がある。
各ステージ
Mermaidのフローチャートとして描くと、このチェーン(その中でのDFUの位置を含む)は次のようになる。
flowchart TD
A[Power-on / Reset] --> B[Boot ROM<br/>immutable, on-chip]
B --> C{Valid image on<br/>boot media?}
C -->|No / forced| D[ROM recovery mode<br/>UART / USB]
C -->|Yes| E[SPL<br/>first-stage bootloader]
E --> F[U-Boot<br/>second-stage bootloader]
F --> G{Enter DFU?}
G -->|Yes| H[DFU mode<br/>waiting for firmware over USB]
G -->|No| I[Load kernel + device tree]
I --> J[Linux kernel]
J --> K[Mount root filesystem]
K --> L[init / systemd]
そしてレンダリングするとこうなる。
Boot ROM
製造時にシリコンに焼き込まれており、後からその内容を変更することはできない。その唯一の役目は、ブートモードピンやeFuseに従って、少数の起動メディア(eMMC、SD、QSPIフラッシュ、時にはUSB)のいずれかから起動可能な何かを見つけ出し、そこへジャンプすることだ。有効なものが見つからない場合、ほとんどのSoCはこの段階で最小限のUARTまたはUSBリカバリモードにフォールバックする——これがチップと何らかの形で通信できる、最初の地点である。
SPL
Secondary Program Loaderの略(U-Bootでの呼び方であり、他のベンダーはFSBLなどと呼ぶ)。DRAMが初期化される前の段階で、オンチップの小さなSRAM上で動作するため、極めて小さくなければならない。その主な役割はまさにそこにある。DRAMを立ち上げ、その中に次のステージ——完全なU-Boot——を読み込むことだ。
U-Boot本体
これは、多くの人が「ブートローダー」と言うときに実際に思い浮かべているものだ。ドライバ、シェル、環境変数、ネットワークサポート、コマンドインタプリタを備えている。DFUが実際に存在しているのもここである——dfu 0 mmc 0(または類似のコマンド)を実行すると、U-Bootは通常のブート処理を続ける代わりにDFUモードに入る。これが、ホスト側からdfu-utilが通信する相手となるモードだ。そうでなければ、カーネルイメージとデバイスツリーblobをメモリに読み込み、カーネルへジャンプする。
カーネルとユーザー空間
カーネルは自身を展開し、コンソールを立ち上げ、渡されたデバイスツリーを使ってハードウェアをプローブし、ルートファイルシステムをマウントする——多くの場合、ブートローダーが起動したのと同じeMMCやSDカードであり、開発中はNFSであることもある。ルートファイルシステムがマウントされると、カーネルはPID 1——Yoctoでビルドされたイメージでは通常systemd——に処理を引き継ぎ、そこで実際に「ユーザー空間」が始まる。
これがDFUにとって重要な理由
DFUは、それがどこに位置するのかが分かって初めて意味を持つ。それはカーネルを読み込む代わりにU-Bootが取ることのできる迂回路であって、上に別途取り付けられた独立した仕組みではない。だからこそDFUはすべての障害モードを救えるわけではない——boot ROM自体が有効なSPLを見つけられなければ、そもそもU-Bootにすら到達せず、boot ROMがサポートする何らかのリカバリモードに頼るしかなくなる(これはベンダーによって大きく異なり、別の記事にふさわしいテーマだ)。
関連記事
- デバイスツリーとは何か — ハードウェアをカーネルにどう伝えるか
- DFUとは何か — 他に手がないときの USB 経由のファームウェア書き込み
参考文献
- U-Boot: Generic SPL framework — SPLがどのようにビルドされ、何を担っているか。
- Trusted Firmware-A: Firmware Design — セキュアブートチェーンを備えた多くの最近のArm SoCで使われている、より作り込まれたマルチステージのブートフロー(BL1/BL2/BL31/BL32/BL33)。これらのプラットフォームではU-Bootの下層に位置する。
コメント