ブートローダーの概要

ブートローダーは、デバイス上でカーネルを起動するためのベンダー独自のイメージです。デバイスの状態を監視し、高信頼実行環境(TEE)を初期化して、そのルート オブ トラストをバインドします。また、ブートローダーは実行をカーネルに移行する前に、boot パーティションと recovery パーティションの整合性を検証します。

ブートローダー フローの例

ブートローダー フローの例を次に示します。

  1. メモリを読み込んで初期化します。

  2. 確認付きブートのフローに沿ってデバイスを検証します。

  3. 確認付きブートのフローに沿って、bootdtboinit_bootrecovery などのブート パーティションを検証します。この手順の一環として、ブートイメージ ヘッダーのバージョンを確認し、それに応じてヘッダーを解析します。

  4. A/B アップデートが使用される場合、現在のブートスロットを決定します。

  5. リカバリモードで起動するかどうかを決定します。詳細については、OTA アップデートのサポートをご覧ください。

  6. ブートイメージ(boot.imgvendor_boot.imginit_boot.img など)と、他の独自のベンダー ブートイメージを読み込みます。このブートイメージには、カーネル イメージと RAM ディスク イメージが含まれます。

    1. 自己実行型の圧縮バイナリとしてカーネルをメモリに読み込みます。カーネルは自己解凍し、メモリへの実行を開始します。

    2. RAM ディスクと bootconfig セクションをメモリに読み込み、initramfs を作成します。

ブートローダー関連のその他の機能

実装可能なブートローダー関連のその他の機能は次のとおりです。

  • デバイスツリー オーバーレイ(DTO): デバイスツリー オーバーレイにより、ブートローダーはさまざまなハードウェア構成をサポートできます。DTO は、ブートローダーが使用するデバイスツリー blob(DTB)にコンパイルされます。

  • カーネル イメージ仮想アドレス ランダム化: ブートローダーは、カーネル イメージを読み込む仮想アドレスのランダム化をサポートしています。アドレスをランダム化するには、カーネル構成で RANDOMIZE_BASEtrue に設定します。ブートローダーは、ランダムな u64 値を /chosen/kaslr-seed デバイスツリー ノードに渡してエントロピーを指定する必要があります。

  • 確認付きブート: 確認付きブートにより、ブートローダーは、信頼できる提供元のコードを確実に実行できます。

  • ブート構成: ブート構成は Android 12 以降で利用できます。ビルドとブートローダーからオペレーティング システムに構成の詳細を渡すメカニズムです。Android 12 より前のバージョンでは、接頭辞が androidboot のカーネル コマンドライン パラメータが使用されます。

  • 無線(OTA)アップデート: 実際に利用中の Android デバイスで、システム、アプリ ソフトウェア、タイムゾーン ルールの OTA アップデートを受信してインストールできます。この機能は、ブートローダーの実装に影響します。OTA の一般的な情報については、OTA アップデートをご覧ください。ブートローダー固有の OTA 実装の詳細については、OTA アップデートのサポートをご覧ください。

  • バージョン バインディング: バージョン バインディングは、オペレーティング システムとパッチレベルのバージョンにセキュリティ キーをバインドします。バージョン バインディングにより、攻撃者が古いバージョンのシステムまたは TEE ソフトウェアに脆弱性を見つけても、デバイスを脆弱なバージョンにロールバックして新しいバージョンで作成された鍵を使用することができなくなります。ブートローダーは、バージョン バインディングをサポートするために、特定の情報を提供する必要があります。詳しくは、AVB プロパティ内のバージョン情報をご覧ください。

カーネル コマンドライン

次の場所からカーネル コマンドラインを連結します。

  • ブートローダー コマンドライン: ブートローダーにより決定される静的パラメータと動的パラメータのセット

  • デバイスツリー: chosen/bootargs ノードから

  • defconfig: CONFIG_CMDLINE から

  • boot.img: コマンドラインから(オフセットとサイズについては、system/core/mkbootimg/bootimg.h を参照)

Android 12 以降では、Android ユーザー空間に渡す必要がある androidboot.* パラメータについて、カーネル コマンドラインの代わりに bootconfig を使用できます。