Android の実装には、ブートローダーが使用するデバイスツリー blob(DTB)イメージを含めることができます。DTB イメージの場所(および DTB イメージのパラメータを指定するためのオプション)は、Android リリースごとに異なります。
Android 11 では、汎用カーネル イメージ(GKI)を使用するデバイスはベンダー ブート パーティションをサポートしている必要があります。これには、ブート パーティションから再配置されたすべてのベンダー固有情報が含まれます。DTB イメージは、ベンダー固有のデータを含んでいるため、現在はベンダー ブート パーティションの一部になっています。DTB イメージのパラメータを指定するには、ベンダー ブートヘッダーをご覧ください。
Android 10 搭載デバイスでは、ブート パーティションに DTB イメージを含めることができます。DTB イメージのパラメータを指定するには、ブートイメージに DTB イメージを含めるをご覧ください。
Android 9 以前では、DTB イメージが独自のパーティションに配置されるか、カーネル
image.gz
に追加されるかして、カーネル + DTB イメージが作成されます(その後、mkbootimg
に渡されboot.img
が作成されます)。
DTB 画像形式
Android 10 以降では、DTB イメージは次のいずれかの形式を使用する必要があります。
連続して結合されている DT blob。。ブートローダーは、各 FDT ヘッダーで
totalsize
フィールドを使用して、対応する blob の読み取りと解析を行います。DTB/DTBO パーティション。ブートローダーでは、エントリのハードウェア識別情報を格納できる
dt_table_entry
構造体(id
、rev
、custom
の各フィールドが格納されている)を調べることにより、適切な DT blob を効率的に選択できます。詳しくは、DTB/DTBO パーティションをご覧ください。
ブートイメージに DTB イメージを含める
Android 10 搭載デバイスでは、DTB イメージをブートイメージに含めることができます。これにより、カーネルで DTB イメージを image.gz
に追加するスクリプトを Android がサポートする必要がなくなり、ベンダー テストスイート(VTS)テストを使用して DTB プレースメントを検証(および標準化)できるようになりました。
さらに、非 A/B デバイスの場合、DTB を個別のパーティションに入れずにリカバリ イメージの一部にする方が、OTA の中断による問題を安全に防止できます。OTA の実行中、DTB パーティションのアップデート後(かつアップデート全体の完了前)に問題が発生すると、デバイスは OTA を完了するためにリカバリモードで起動しようとします。ただし、DTB パーティションがすでにアップデートされているため、まだアップデートされていないリカバリ イメージとの不一致が生じる可能性があります。DTB イメージをブートイメージ形式の一部にすることで、リカバリ イメージを自立させる(他のパーティションに依存しないようにする)ことができ、前述のような問題の発生を防ぐことができます。
ブートイメージの構造
Android 10 搭載デバイスでは、次のブートイメージ構造を使用して DTB イメージを含めることができます。
ブートイメージ セクション | ページ数 |
---|---|
ブートヘッダー(1 ページ) | 1 |
カーネル(l ページ) | l = (kernel_size + page_size -
1) / page_size |
Ramdisk(m ページ) | m = (ramdisk_size + page_size -
1) / page_size |
第 2 段階のブートローダー(n ページ) | n = (second_size + page_size -
1) / page_size |
リカバリ DTBO(o ページ) | o = (recovery_dtbo_size + page_size -
1) / page_size |
DTB(p ページ) | p = (dtb_size + page_size -
1) / page_size |
DTB イメージパス
Android 10 搭載デバイスでは、mkbootimg.py
ツールと以下の引数を使用して DTB イメージのパスを指定できます。
引数 | 説明 |
---|---|
dtb |
ブート / リカバリ イメージに含める DTB イメージのパス。 |
dtb_offset |
base 引数に追加した場合、最終的なデバイスツリーの物理ロードアドレスを表します。たとえば、base 引数が 0x10000000 で dtb_offset 引数が 0x01000000 の場合、ブートイメージ ヘッダーの dtb_addr_field には 0x11000000 が代入されます。 |
DTB イメージのパスの指定にはボード構成変数 BOARD_PREBUILT_DTBIMAGE_DIR
を使用する必要があります。拡張子が *.dtb
であるファイルがディレクトリ BOARD_PREBUILT_DTBIMAGE_DIR
に複数存在する場合、Android ビルドシステムはこれらのファイルを連結して、ブートイメージ作成に使用する最終的な DTB イメージを作成します。
BOARD_PREBUILT_DTBIMAGE_DIR
で指定されたディレクトリにある DTB イメージと引数 dtb
を mkbootimg.py
に渡すには、ボード構成変数 BOARD_INCLUDE_DTB_IN_BOOTIMG
を true
に設定する必要があります。次に例を示します。
BOARD_INCLUDE_DTB_IN_BOOTIMG := true
dtb_offset
引数を、他のオフセットやヘッダー バージョンとあわせて、ボード構成変数 BOARD_MKBOOTIMG_ARGS
に追加できます。次に例を示します。
BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --dtb_offset $(BOARD_DTB_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
ブートローダーのサポート
Android 10 搭載デバイスで VTS を正常に実行するには、アップデートされたブートイメージがブートローダーでサポートされている必要があります。また、カーネル コマンドライン パラメータ androidboot.dtb_idx
を追加して、選択したデバイスツリー(DT)のインデックスを示す必要があります。インデックスは 1 つしか指定できません。たとえば、パラメータ androidboot.dtb_idx=N
は、N
を、ブートイメージ内にある DTB のセットからブートローダーによって選択されたデバイスツリーのゼロベースのインデックスとしてレポートします。