# 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 | | 8 (value=ANDROID!) | |--------------------------------+--------------------------| --> 8 | | 4 | |--------------------------------+--------------------------| --> 12 | | 4 | |--------------------------------+--------------------------| --> 16 (0x10) | | 4 | |--------------------------------+--------------------------| --> 20 | | 4 | |--------------------------------+--------------------------| --> 24 | | 4 | |--------------------------------+--------------------------| --> 28 | | 4 | |--------------------------------+--------------------------| --> 32 (0x20) | | 4 | |--------------------------------+--------------------------| --> 36 | | 4 | |--------------------------------+--------------------------| --> 40 (0x28) |
| 4 (value in [0,1,2]) | |--------------------------------+--------------------------| --> 44 | | 4 | |--------------------------------+--------------------------| --> 48 (0x30) | | 16 | |--------------------------------+--------------------------| --> 64 (0x40) | | 512 | |--------------------------------+--------------------------| --> 576 (0x240) | | 32 | |--------------------------------+--------------------------| --> 608 (0x260) | | 1024 | |--------------------------------+--------------------------| --> 1632 (0x660) | [v1] | 4 | |--------------------------------+--------------------------| --> 1636 | [v1] | 8 | |--------------------------------+--------------------------| --> 1644 |
[v1] | 4 (v1: value=1648) | | | (v2: value=1660) | |--------------------------------+--------------------------| --> 1648 (0x670) | [v2] | 4 | |--------------------------------+--------------------------| --> 1652 | [v2] | 8 | |--------------------------------+--------------------------| --> 1660 (0x67c) | | min(n * page_size | | | - header_size) | +--------------------------------+--------------------------+ --> pagesize ### data +-----------------------------------------------------------+ --> pagesize | | kernel length | |--------------------------------+--------------------------| | | min(n * page_size - len) | +-----------------------------------------------------------+ +-----------------------------------------------------------+ | | ramdisk length | |--------------------------------+--------------------------| | | min(n * page_size - len) | +-----------------------------------------------------------+ +-----------------------------------------------------------+ | | second bootloader length | |--------------------------------+--------------------------| | | min(n * page_size - len) | +-----------------------------------------------------------+ +-----------------------------------------------------------+ | [v1] | recovery dtbo length | |--------------------------------+--------------------------| | [v1] | min(n * page_size - len) | +-----------------------------------------------------------+ +-----------------------------------------------------------+ | [v2] | dtb length | |--------------------------------+--------------------------| | [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 | | 8 (value=ANDROID!) | |--------------------------------+--------------------------| --> 8 | | 4 | |--------------------------------+--------------------------| --> 12 | | 4 | |--------------------------------+--------------------------| --> 16 | | 4 | |--------------------------------+--------------------------| --> 20 |
| 4 | |--------------------------------+--------------------------| --> 24 | | 4 * 4 | |--------------------------------+--------------------------| --> 40 (0x28) |
| 4 (value in [3|4]) | |--------------------------------+--------------------------| --> 44 | | 1024+512=1536 | |--------------------------------+--------------------------| --> 1580 | (v4 only) | 4 (values in [4096|0]) | |--------------------------------+--------------------------| --> 1584 | | min(n * page_size | | | - header_size) | +--------------------------------+--------------------------+ --> pagesize=4096 ### data +-----------------------------------------------------------+ --> pagesize | | kernel length | +-----------------------------------------------------------+ --> + kernel len | | ramdisk length | +-----------------------------------------------------------+ --> + ramdisk len | (v4 only) | boot signature length | | | GKI 1.0 : 4K | | | GKI 2.0 : 16K | +--------------------------------+--------------------------+ --> + boot sig len | | 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 | | 8 (vaue=VNDRBOOT) | |--------------------------------+--------------------------| --> 8 |
| 4 (value=3) | |--------------------------------+--------------------------| --> 12 | | 4 | |--------------------------------+--------------------------| --> 16 | | 4 | |--------------------------------+--------------------------| --> 20 | | 4 | |--------------------------------+--------------------------| --> 24 | | 4 | |--------------------------------+--------------------------| --> 28 | | 2048 | |--------------------------------+--------------------------| --> 2076 | | 4 | |--------------------------------+--------------------------| --> 2080 | | 16 | |--------------------------------+--------------------------| --> 2096 |
| 4 (v3: value=2112) | | | 4 (v4: value=2128) | |--------------------------------+--------------------------| --> 2100 | | 4 | |--------------------------------+--------------------------| --> 2104 | | 8 | |--------------------------------+--------------------------| --> 2112 | | 4 (v4 only) | |--------------------------------+--------------------------| --> 2116 || 4 (v4 only) | |--------------------------------+--------------------------| --> 2120 | 2124 | | 4 (v4 only) | |--------------------------------+--------------------------| --> 2128 | | min(n * page_size | | | - header_size) | +--------------------------------+--------------------------+ --> pagesize ### data +------------------+-------------+--------------------------+ --> pagesize | | ramdisk 1 | | | |-------------+ | | | ramdisk 2 | | | |-------------+ padded len | | | ramdisk n | | | |-------------+ | --> pagesize + vendor_ramdisk_total_size | | padding | | +------------------+-------------+--------------------------+ --> pagesize + vendor_ramdisk_total_size + padding | | dtb | | | |-------------+ padded len | | | padding | | +------------------+-------------+--------------------------+ --> dtb offset + dtb size + padding | | entry 1 | | | table> |-------------+ | | | entry 2 | padded len | | |-------------+ | | | entry n | | | (v4) |-------------+ | | | padding | | +------------------+----------------------------------------+ --> vrt offset + vrt size + padding | (v4) | padded len | +--------------------------------+--------------------------+ ## 4. signature part ### 4.1 Boot Image Signature (VBoot 1.0) +--------------------------------+--------------------------+ --> end of data part | | signature length | |--------------------------------+--------------------------+ | | 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" └──────────────────┴─────────────────────┘ ```