# layout of [vendor\_]boot.img [1. boot.img v0-v2](#1-bootimg-v0-v2) [2. boot.img v3-v4](#2-bootimg-v3-v4) [3. vendor_boot.img v3-v4](#3-vendor_bootimg-v3-v4) [4. signature part](#4-signature-part) - [4.1 Boot Image Signature](#41-boot-image-signature-vboot-10) - [4.2 AVB Footer](#42-avb-footer-vboot-20) [5. boot in memory](#5-boot-in-memory) ## 1. boot.img v0-v2 ### header Value at 0x28 is one of {0x00,0x01,0x02,0x03,0x04}, this filed should be read first to identify header version. item size in bytes position +-----------------------------------------------------------+ --> 0 |<MAGIC HEADER> | 8 (value=ANDROID!) | |--------------------------------+--------------------------| --> 8 |<kernel length> | 4 | |--------------------------------+--------------------------| --> 12 |<kernel offset> | 4 | |--------------------------------+--------------------------| --> 16 (0x10) |<ramdisk length> | 4 | |--------------------------------+--------------------------| --> 20 |<ramdisk offset> | 4 | |--------------------------------+--------------------------| --> 24 |<second bootloader length> | 4 | |--------------------------------+--------------------------| --> 28 |<second bootloader offset> | 4 | |--------------------------------+--------------------------| --> 32 (0x20) |<tags offset> | 4 | |--------------------------------+--------------------------| --> 36 |<page size> | 4 | |--------------------------------+--------------------------| --> 40 (0x28) |<header version> | 4 (value in [0,1,2]) | |--------------------------------+--------------------------| --> 44 |<os version & os patch level> | 4 | |--------------------------------+--------------------------| --> 48 (0x30) |<board name> | 16 | |--------------------------------+--------------------------| --> 64 (0x40) |<cmdline part 1> | 512 | |--------------------------------+--------------------------| --> 576 (0x240) |<hash digest> | 32 | |--------------------------------+--------------------------| --> 608 (0x260) |<cmdline part 2> | 1024 | |--------------------------------+--------------------------| --> 1632 (0x660) |<recovery dtbo length> [v1] | 4 | |--------------------------------+--------------------------| --> 1636 |<recovery dtbo offset> [v1] | 8 | |--------------------------------+--------------------------| --> 1644 |<header size> [v1] | 4 (v1: value=1648) | | | (v2: value=1660) | |--------------------------------+--------------------------| --> 1648 (0x670) |<dtb length> [v2] | 4 | |--------------------------------+--------------------------| --> 1652 |<dtb offset> [v2] | 8 | |--------------------------------+--------------------------| --> 1660 (0x67c) |<padding> | min(n * page_size | | | - header_size) | +--------------------------------+--------------------------+ --> pagesize ### data +-----------------------------------------------------------+ --> pagesize |<kernel> | kernel length | |--------------------------------+--------------------------| |<padding> | min(n * page_size - len) | +-----------------------------------------------------------+ +-----------------------------------------------------------+ |<ramdisk> | ramdisk length | |--------------------------------+--------------------------| |<padding> | min(n * page_size - len) | +-----------------------------------------------------------+ +-----------------------------------------------------------+ |<second bootloader> | second bootloader length | |--------------------------------+--------------------------| |<padding> | min(n * page_size - len) | +-----------------------------------------------------------+ +-----------------------------------------------------------+ |<recovery dtbo> [v1] | recovery dtbo length | |--------------------------------+--------------------------| |<padding> [v1] | min(n * page_size - len) | +-----------------------------------------------------------+ +-----------------------------------------------------------+ |<dtb> [v2] | dtb length | |--------------------------------+--------------------------| |<padding> [v2] | min(n * page_size - len) | +-----------------------------------------------------------+ --> end of data part ## 2. boot.img v3-v4 For partitions: `/boot`, `/init_boot` or `/recovery`. ### header item size in bytes position +-----------------------------------------------------------+ --> 0 |<MAGIC HEADER> | 8 (value=ANDROID!) | |--------------------------------+--------------------------| --> 8 |<kernel size> | 4 | |--------------------------------+--------------------------| --> 12 |<ramdisk size> | 4 | |--------------------------------+--------------------------| --> 16 |<os version & os patch level> | 4 | |--------------------------------+--------------------------| --> 20 |<header size> | 4 | |--------------------------------+--------------------------| --> 24 |<reserved> | 4 * 4 | |--------------------------------+--------------------------| --> 40 (0x28) |<header version> | 4 (value in [3|4]) | |--------------------------------+--------------------------| --> 44 |<cmdline> | 1024+512=1536 | |--------------------------------+--------------------------| --> 1580 |<signature_size> (v4 only) | 4 (values in [4096|0]) | |--------------------------------+--------------------------| --> 1584 |<padding> | min(n * page_size | | | - header_size) | +--------------------------------+--------------------------+ --> pagesize=4096 ### data +-----------------------------------------------------------+ --> pagesize |<kernel> | kernel length | +-----------------------------------------------------------+ --> + kernel len |<ramdisk> | ramdisk length | +-----------------------------------------------------------+ --> + ramdisk len |<boot signature> (v4 only) | boot signature length | | | GKI 1.0 : 4K | | | GKI 2.0 : 16K | +--------------------------------+--------------------------+ --> + boot sig len |<padding> | min(n * page_size - len) | +-----------------------------------------------------------+ ## 3. vendor\_boot.img v3-v4 For partitions: `/vendor_boot` or `/vendor_kernel_boot`. ### header item size in bytes position +-----------------------------------------------------------+ --> 0 |<MAGIC HEADER> | 8 (vaue=VNDRBOOT) | |--------------------------------+--------------------------| --> 8 |<header version> | 4 (value=3) | |--------------------------------+--------------------------| --> 12 |<page size> | 4 | |--------------------------------+--------------------------| --> 16 |<kernel load addr> | 4 | |--------------------------------+--------------------------| --> 20 |<ramdisk load addr> | 4 | |--------------------------------+--------------------------| --> 24 |<vendor ramdisk total size> | 4 | |--------------------------------+--------------------------| --> 28 |<vendor cmdline> | 2048 | |--------------------------------+--------------------------| --> 2076 |<tags offset> | 4 | |--------------------------------+--------------------------| --> 2080 |<board name> | 16 | |--------------------------------+--------------------------| --> 2096 |<header size> | 4 (v3: value=2112) | | | 4 (v4: value=2128) | |--------------------------------+--------------------------| --> 2100 |<dtb size> | 4 | |--------------------------------+--------------------------| --> 2104 |<dtb load addr> | 8 | |--------------------------------+--------------------------| --> 2112 |<vendor ramdisk table size> | 4 (v4 only) | |--------------------------------+--------------------------| --> 2116 |<vendor ramdisk table entry num>| 4 (v4 only) | |--------------------------------+--------------------------| --> 2120 |<vendor ramdisk table entry size| 4 (v4 only) | |--------------------------------+--------------------------| --> 2124 |<bootconfig size> | 4 (v4 only) | |--------------------------------+--------------------------| --> 2128 |<padding> | min(n * page_size | | | - header_size) | +--------------------------------+--------------------------+ --> pagesize ### data +------------------+-------------+--------------------------+ --> pagesize | | ramdisk 1 | | | |-------------+ | | | ramdisk 2 | | |<vendor ramdisks> |-------------+ padded len | | | ramdisk n | | | |-------------+ | --> pagesize + vendor_ramdisk_total_size | | padding | | +------------------+-------------+--------------------------+ --> pagesize + vendor_ramdisk_total_size + padding | | dtb | | |<dtb> |-------------+ padded len | | | padding | | +------------------+-------------+--------------------------+ --> dtb offset + dtb size + padding |<vendor ramdisk > | entry 1 | | | table> |-------------+ | | | entry 2 | padded len | | |-------------+ | | | entry n | | | (v4) |-------------+ | | | padding | | +------------------+----------------------------------------+ --> vrt offset + vrt size + padding |<bootconfig> (v4) | padded len | +--------------------------------+--------------------------+ ## 4. signature part ### 4.1 Boot Image Signature (VBoot 1.0) +--------------------------------+--------------------------+ --> end of data part |<signature> | signature length | |--------------------------------+--------------------------+ |<padding> | defined by boot_signer | +--------------------------------+--------------------------+ ### 4.2 AVB Footer (VBoot 2.0) item size in bytes position +------+--------------------------------+-------------------------+ --> end of data part (say locaton +0) | | VBMeta Header | total 256 | | | | | | | - Header Magic "AVB0" | 4 | | | - avb_version Major | 4 | | | - avb_version Minor | 4 | | | - authentication_blob_size | 8 | | | - auxiliary blob size | 8 | | | - algorithm type | 4 | | | - hash_offset | 8 | | | - hash_size | 8 | | | - signature_offset | 8 | | | - signature_size | 8 | | | - pub_key_offset | 8 | |VBMeta| - pub_key_size | 8 | | Blob | - pub_key_metadata_offset | 8 | | | - pub_key_metadata_size | 8 | | | - descriptors_offset | 8 | | | - descriptors_size | 8 | | | - rollback_index | 8 | | | - flags | 4 | | | - RESERVED | 4 | | | - release string | 47 | | | - NULL | 1 | | | - RESERVED | 80 | | |--------------------------------+-------------------------+ --> + 256 | | Authentication Blob | | | | - Hash of Header & Aux Blob | alg.hash_num_bytes | --> + 256 + hash_offset | | - Signature of Hash | alg.signature_num_bytes | --> + 256 + signature_offset | | - Padding | align by 64 | | +--------------------------------+-------------------------+ | | Auxiliary Blob | | | | - descriptors | | --> + 256 + authentication_blob_size + descriptors_offset | | - pub key | | --> + 256 + authentication_blob_size + pub_key_offset | | - pub key meta data | | --> + 256 + authentication_blob_size + pub_key_metadata_offset | | - padding | align by 64 | | +--------------------------------+-------------------------+ | | Padding | align by block_size | +------+--------------------------------+-------------------------+ --> + (block_size * n) +---------------------------------------+-------------------------+ | | | | | | | DONOT CARE CHUNK | | | | | | | | +---------------------------------------+-------------------------+ +---------------------------------------+-------------------------+ --> partition_size - block_size | Padding | block_size - 64 | +---------------------------------------+-------------------------+ --> partition_size - 64 | AVB Footer | total 64 | | | | | - Footer Magic "AVBf" | 4 | | - Footer Major Version | 4 | | - Footer Minor Version | 4 | | - Original image size | 8 | | - VBMeta offset | 8 | | - VBMeta size | 8 | | - Padding | 28 | +---------------------------------------+-------------------------+ --> partition_size ## 5. boot in memory ``` ┌────────────────────────────────────────┐ │ kernel │ ├──────────────────┬─────────────────────┤ │ │ vendor ramdisk 1 │ │ ├─────────────────────┤ │ │ vendor ramdisk 2 │ │ vendor ramdisks ├─────────────────────┤ │ │ ... │ │ ├─────────────────────┤ │ │ vendor ramdisk n │ ├──────────────────┴─────────────────────┤ │ generic ramdisk (from init_boot/boot) │ ├──────────────────┬─────────────────────┤ │ │parameters │ │ ├─────────────────────┤ │ │param size (4) │ │ bootconfig ├─────────────────────┤ │ │param checksum (4) │ │ ├─────────────────────┤ │ │bootconfig magic(12) │ --> "#BOOTCONFIG\n" └──────────────────┴─────────────────────┘ ```