組み込み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]

そしてレンダリングするとこうなる。

組み込みLinuxのブートチェーンのフローチャート。電源投入によりboot ROMへリセットされ、boot ROMは起動メディア上に有効なイメージがあるかを確認する。見つからない場合(またはリカバリが強制された場合)は、UART/USBリカバリモードに入る。そうでなければSPLを読み込み、SPLが正式なU-Bootを読み込む。U-BootはUSB経由のファームウェアを待つDFUモードに入るか、カーネルとデバイスツリーを読み込んでLinuxを起動し、ルートファイルシステムをマウントして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がサポートする何らかのリカバリモードに頼るしかなくなる(これはベンダーによって大きく異なり、別の記事にふさわしいテーマだ)。

関連記事

参考文献

コメント