ブートローダーは、デバイス上でカーネルを起動するためのベンダー独自のイメージです。デバイスの状態を監視し、高信頼実行環境(TEE)を初期化して、そのルート オブ トラストをバインドします。また、ブートローダーは実行をカーネルに移行する前に、boot
パーティションと recovery
パーティションの整合性を検証します。
ブートローダー フローの例
ブートローダー フローの例を次に示します。
メモリを読み込んで初期化します。
確認付きブートのフローに沿ってデバイスを検証します。
確認付きブートのフローに沿って、
boot
、dtbo
、init_boot
、recovery
などのブート パーティションを検証します。この手順の一環として、ブートイメージ ヘッダーのバージョンを確認し、それに応じてヘッダーを解析します。A/B アップデートが使用される場合、現在のブートスロットを決定します。
リカバリモードで起動するかどうかを決定します。詳細については、OTA アップデートのサポートをご覧ください。
ブートイメージ(
boot.img
、vendor_boot.img
、init_boot.img
など)と、他の独自のベンダー ブートイメージを読み込みます。このブートイメージには、カーネル イメージと RAM ディスク イメージが含まれます。自己実行型の圧縮バイナリとしてカーネルをメモリに読み込みます。カーネルは自己解凍し、メモリへの実行を開始します。
RAM ディスクと bootconfig セクションをメモリに読み込み、
initramfs
を作成します。
ブートローダー関連のその他の機能
実装可能なブートローダー関連のその他の機能は次のとおりです。
デバイスツリー オーバーレイ(DTO): デバイスツリー オーバーレイにより、ブートローダーはさまざまなハードウェア構成をサポートできます。DTO は、ブートローダーが使用するデバイスツリー blob(DTB)にコンパイルされます。
カーネル イメージ仮想アドレス ランダム化: ブートローダーは、カーネル イメージを読み込む仮想アドレスのランダム化をサポートしています。アドレスをランダム化するには、カーネル構成で
RANDOMIZE_BASE
をtrue
に設定します。ブートローダーは、ランダムな 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 を使用できます。