ブートローダーの概要

ブートローダーは、デバイス上でカーネルを起動するベンダー独自のイメージです。ブートローダーはデバイスの状態を保護し、 Trusted Execution Environment (TEE)を初期化し、信頼のルートをバインドする役割を果たします。ブートローダーは、実行をカーネルに移す前に、 bootパーティションとrecoveryパーティションの整合性も検証します。

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

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

  1. メモリをロードして初期化します。

  2. Verified Boot flowに従ってデバイスを検証します。

  3. 確認済みブート フローに従って、 bootdtboinit_boot 、およびrecoveryを含むブート パーティションを確認します。この手順の一部として、ブート イメージ ヘッダーのバージョンを確認し、それに応じてヘッダーを解析します。

  4. A/B 更新を使用する場合は、起動する現在のスロットを決定します。

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

  6. boot.imgvendor_boot.imginit_boot.img 、およびその他の独自のベンダー ブート イメージなどのブート イメージをロードします。これらのブート イメージには、カーネル イメージと RAM ディスク イメージが含まれています。

    1. カーネルを自己実行可能な圧縮バイナリとしてメモリにロードします。カーネルはそれ自体を解凍し、メモリへの実行を開始します。

    2. RAM ディスクと bootconfig セクションをメモリにロードして、 initramfsを作成します。

追加のブートローダー関連機能

以下は、実装できる追加のブートローダー関連機能のリストです。

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

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

  • 確認済みの起動。検証済みのブートにより、ブートローダーは、実行されたすべてのコードが信頼できるソースからのものであることを確認できます。

  • ブート構成。ブート構成は 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を使用できます。