부팅 이미지 헤더

Android 9는 부팅 이미지 헤더에 버전 필드를 도입하여 이전 버전과의 호환성을 유지하면서도 헤더 업데이트가 가능합니다. 부트로더가 헤더 버전 필드를 확인하고 그에 따라 헤더를 파싱해야 합니다. 기기별 부팅 헤더 버전은 다음과 같습니다.

  • Android 13을 실행하는 기기는 부팅 헤더 버전 3 또는 4를 사용할 수 있습니다. 일반 커널 이미지 (GKI) 아키텍처를 지원하는 기기의 경우 버전 4가 기본 부팅 이미지이며 부팅 헤더의 os_version 필드가 0이어야 합니다. 기기 부트로더는 Android 자체 검사 부팅(AVB) 속성에서 버전 정보를 가져와야 합니다.
  • Android 12를 실행하는 기기는 부팅 헤더 버전 3 또는 4를 사용할 수 있습니다. 일반 커널 이미지(GKI) 아키텍처를 지원하는 기기의 경우 버전 4가 기본 부팅 이미지입니다.
  • Android 11을 실행하는 기기는 부팅 헤더 버전 3을 사용할 수 있습니다. 일반 커널 이미지(GKI) 아키텍처를 지원하는 기기의 경우 이 버전을 기본 부팅 이미지에 사용해야 합니다.
  • Android 10을 실행하는 기기는 부팅 헤더 버전 2를 사용해야 합니다.
  • Android 9를 실행하는 기기는 부팅 헤더 버전 1을 사용해야 합니다.
  • Android 8 이하를 실행하는 기기는 부팅 이미지 헤더 버전 0을 사용하는 것으로 간주합니다.

Android 9 이상을 실행하는 모든 기기의 경우 공급업체 테스트 모음(VTS)에서 boot/recovery 이미지 형식을 검사하여 부팅 이미지 헤더가 올바른 버전을 사용하는지 확인합니다. 현재 지원되는 모든 부팅 및 공급업체 부팅 이미지 헤더의 AOSP 세부정보를 보려면 system/tools/mkbootimg/include/bootimg/bootimg.h를 참고하세요.

부팅 이미지 헤더 버전 관리 구현

mkbootimg 도구는 다음 인수를 허용합니다.

인수 설명
header_version 부팅 이미지 헤더 버전을 설정합니다. 헤더 버전에 따른 부팅 이미지는 다음과 같습니다.
  • 1 또는 2에서 복구 DTBO 이미지 또는 복구 ACPIO 이미지를 지원합니다.
  • 3은 복구 이미지를 지원하지 않습니다.
recovery_dtbo DTB를 사용하는 아키텍처에 사용됩니다. 복구 DTBO 이미지 경로를 지정합니다. 복구 이미지가 필요 없는 A/B 기기의 경우에는 선택사항입니다. header_version을 사용하는 비 A/B 기기는 다음과 같습니다.
  • 1 또는 2는 이 경로를 지정하거나 recovery_acpio 섹션을 사용하여 복구 ACPIO 이미지 경로를 지정합니다.
  • 3은 복구 DTBO 이미지를 지정할 수 없습니다.
recovery_acpio DTB 대신 ACPI를 사용하는 아키텍처에 사용됩니다. 복구 ACPIO 이미지 경로를 지정합니다. 복구 이미지가 필요 없는 A/B 기기의 경우 선택사항입니다. header_version을 사용하는 비 A/B 기기는 다음과 같습니다.
  • 1 또는 2는 이 경로를 지정하거나 recovery_dtbo 섹션을 사용하여 복구 DTBO 이미지 경로를 지정합니다.
  • 3은 복구 ACPIO 이미지를 지정할 수 없습니다.
dtb 부팅/복구 이미지에 포함된 DTB 이미지 경로입니다.
dtb_offset base 인수에 추가되면 최종 기기 트리의 실제 로드 주소를 제공합니다. 예를 들어 base 인수가 0x10000000이고 dtb_offset 인수가 0x01000000이면 부팅 이미지 헤더의 dtb_addr_field0x11000000으로 채워집니다.

기기 BoardConfig.mk는 구성 BOARD_MKBOOTIMG_ARGS를 사용하여 header versionmkbootimg의 다른 보드별 인수에 추가합니다. 예:

BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)

Android 빌드 시스템은 BoardConfig의 변수 BOARD_PREBUILT_DTBOIMAGE를 사용하여 복구 이미지 생성 중에 mkbootimg 도구의 recovery_dtbo 인수를 설정합니다. Android 오픈소스 프로젝트(AOSP) 변경사항에 관한 자세한 내용은 부팅 이미지 헤더 버전 관리 관련 변경 목록을 참고하세요.

부팅 이미지 헤더, 버전 4

Android 12는 부팅 이미지 헤더 버전 4에서 커널과 램디스크의 무결성을 확인하는 데 사용할 수 있는 boot_signature를 제공합니다. 확인은 VtsSecurityAvbTest에서 실행되며 GKI 아키텍처를 사용하는 기기에 필요합니다. 그러나 boot_signature는 기기별 자체 검사 부팅 프로세스에 관여하지 않으며 VTS에서만 사용됩니다. 자세한 내용은 GKI boot.img 보드 구성GKI 자체 검사 부팅 설정을 참고하세요.

공급업체 부팅 이미지 헤더 버전 4는 여러 공급업체 램디스크 프래그먼트를 지원합니다.

부팅 이미지 헤더 버전 4는 다음 형식을 사용합니다.

struct boot_img_hdr
{
#define BOOT_MAGIC_SIZE 8
    uint8_t magic[BOOT_MAGIC_SIZE];

    uint32_t kernel_size;    /* size in bytes */
    uint32_t ramdisk_size;   /* size in bytes */

    uint32_t os_version;

    uint32_t header_size;    /* size of boot image header in bytes */
    uint32_t reserved[4];
    uint32_t header_version; /* offset remains constant for version check */

#define BOOT_ARGS_SIZE 512
#define BOOT_EXTRA_ARGS_SIZE 1024
    uint8_t cmdline[BOOT_ARGS_SIZE + BOOT_EXTRA_ARGS_SIZE];

    uint32_t signature_size; /* size in bytes */
};

부팅 이미지 헤더, 버전 3

Android 11은 부팅 이미지 헤더를 버전 3으로 업데이트하여 다음 데이터를 삭제합니다.

  • 2단계 부트로더. second_sizesecond_addr 필드는 더 이상 부팅 이미지 헤더에 표시되지 않습니다. 2단계 부트로더를 사용하는 기기는 부트로더를 자체 파티션에 저장해야 합니다.

  • 복구 이미지. 복구 이미지 지정에 관한 요구 사항이 지원 중단되었으며 recovery_dtbo_size, recovery_dtbo_offset, recovery_acpio_size, recovery_acpio_offset 필드가 더 이상 부팅 이미지에 표시되지 않습니다.

    • A/B 기기는 복구용 DTBO 또는 ACPIO 이미지를 지정할 필요가 없는 업데이트 및 복구 체계를 사용합니다.

    • DTBO 또는 ACPIO 복구 이미지를 지정하려는 비 A/B 기기는 부팅 이미지 헤더 버전 1 또는 2를 사용해야 합니다.

  • 기기 트리 blob(DTB). DTB는 공급업체 부팅 파티션에 저장되므로 dtb_sizedtb_addr 필드는 더 이상 부팅 이미지 헤더에 표시되지 않습니다(공급업체 부팅 이미지 헤더에 표시됨).

기기는 부팅 이미지 헤더 버전 3을 사용하여 일반 커널 이미지(GKI) 아키텍처를 준수합니다. 이 아키텍처는 코어 커널을 통합하고 부팅에 필요한 공급업체 모듈을 vendor_boot 파티션으로 이동합니다(부팅 이미지에 GKI 구성요소만 포함됨). 기기에서 지정하는 부팅 이미지 버전은 다음과 같습니다.

  • GKI(android-4.19 또는 android-5.4 커널 필요)를 사용하지만 A/B 업데이트를 사용하지 않는 경우에는 기기에서 부팅 이미지에 부팅 이미지 버전 3을, 복구 이미지에는 부팅 이미지 버전 2를 사용하여 복구 이미지를 지정할 수 있습니다.

  • GKI를 사용하지 않고 A/B 업데이트를 사용하지 않는 경우 기기에서 부팅 이미지와 복구 이미지 모두에 부팅 이미지 버전 1 또는 2를 사용하여 복구 이미지를 지정할 수 있습니다.

부팅 이미지 헤더 버전 3은 다음 형식을 사용합니다.

struct boot_img_hdr
{
#define BOOT_MAGIC_SIZE 8
    uint8_t magic[BOOT_MAGIC_SIZE];

    uint32_t kernel_size;    /* size in bytes */
    uint32_t ramdisk_size;   /* size in bytes */

    uint32_t os_version;

    uint32_t header_size;    /* size of boot image header in bytes */
    uint32_t reserved[4];
    uint32_t header_version; /* offset remains constant for version check */

#define BOOT_ARGS_SIZE 512
#define BOOT_EXTRA_ARGS_SIZE 1024
    uint8_t cmdline[BOOT_ARGS_SIZE + BOOT_EXTRA_ARGS_SIZE];
};

부팅 이미지 헤더, 버전 2

Android 10은 부팅 이미지 헤더를 버전 2로 업데이트하여 복구 DTB 이미지 정보(이미지 크기 및 실제 로드 주소) 섹션을 추가합니다.

부팅 이미지 헤더 버전 2는 다음 형식을 사용합니다.

struct boot_img_hdr
{
    uint8_t magic[BOOT_MAGIC_SIZE];
    uint32_t kernel_size;               /* size in bytes */
    uint32_t kernel_addr;               /* physical load addr */

    uint32_t ramdisk_size;              /* size in bytes */
    uint32_t ramdisk_addr;              /* physical load addr */

    uint32_t second_size;               /* size in bytes */
    uint32_t second_addr;               /* physical load addr */

    uint32_t tags_addr;                 /* physical addr for kernel tags */
    uint32_t page_size;                 /* flash page size we assume */
    uint32_t header_version;
    uint32_t os_version;
    uint8_t name[BOOT_NAME_SIZE];       /* asciiz product name */
    uint8_t cmdline[BOOT_ARGS_SIZE];
    uint32_t id[8];                     /* timestamp / checksum / sha1 / etc */
    uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];
    uint32_t recovery_[dtbo|acpio]_size;    /* size of recovery image */
    uint64_t recovery_[dtbo|acpio]_offset;  /* offset in boot image */
    uint32_t header_size;               /* size of boot image header in bytes */
    uint32_t dtb_size;                  /* size of dtb image */
    uint64_t dtb_addr;                  /* physical load address */
};

부팅 이미지 헤더, 버전 1

Android 9는 부팅 이미지 헤더의 unused 필드를 헤더 버전 필드로 변환합니다. Android 9로 출시되는 기기는 헤더 버전이 1 이상으로 설정된 부팅 이미지 헤더를 사용해야 합니다(VTS에서 확인함).

부팅 이미지 헤더 버전 1은 다음 형식을 사용합니다.

struct boot_img_hdr
{
    uint8_t magic[BOOT_MAGIC_SIZE];
    uint32_t kernel_size;               /* size in bytes */
    uint32_t kernel_addr;               /* physical load addr */
    uint32_t ramdisk_size;              /* size in bytes */
    uint32_t ramdisk_addr;              /* physical load addr */

    uint32_t second_size;               /* size in bytes */
    uint32_t second_addr;               /* physical load addr */

    uint32_t tags_addr;                 /* physical addr for kernel tags */
    uint32_t page_size;                 /* flash page size we assume */
    uint32_t header_version;
    uint32_t os_version;
    uint8_t name[BOOT_NAME_SIZE];       /* asciiz product name */
    uint8_t cmdline[BOOT_ARGS_SIZE];
    uint32_t id[8];                     /* timestamp / checksum / sha1 / etc */
    uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];
    uint32_t recovery_[dtbo|acpio]_size;    /* size of recovery image */
    uint64_t recovery_[dtbo|acpio]_offset;  /* offset in boot image */
    uint32_t header_size;               /* size of boot image header in bytes */
};

비 A/B 기기는 복구용 DTB/ACPI 오버레이 이미지를 지정하여 무선 업데이트(OTA) 실패를 줄일 수 있습니다. (A/B 기기에는 이 문제가 없으며 오버레이 이미지를 지정할 필요가 없습니다.) DTBO 이미지 또는 ACPIO 이미지를 지정할 수 있지만, 다른 아키텍처에서 사용하므로 둘을 동시에 지정할 수는 없습니다. 부팅 이미지 헤더를 올바르게 구성하는 방법은 다음과 같습니다.

  • 복구용 DTBO 이미지를 사용하면 recovery_dtbo_sizerecovery_dtbo_offset 필드를 포함합니다(recovery_acpio_sizerecovery_acpio_offset 필드는 포함하지 않음).

  • 복구용 ACPIO 이미지를 사용하면 recovery_acpio_sizerecovery_acpio_offset 필드를 포함합니다(recovery_dtbo_sizerecovery_dtbo_offset 필드는 포함하지 않음).

header_size 필드에는 부팅 이미지 헤더의 크기가 포함됩니다. 부팅 이미지 헤더 버전이 1로 설정된 경우 id 필드에는 kernel, ramdisk, second sections 외에 부팅 이미지의 recovery_[dtbo|acpio] 섹션을 위한 SHA-1 다이제스트가 포함됩니다. recovery_[dtbo|acpio]_sizerecovery_[dtbo|acpio]_offset 필드에 관한 자세한 내용은 복구 이미지를 참고하세요.

기존 부팅 이미지 헤더, 버전 0

Android 9 이전에 출시되어 기존 부팅 이미지 헤더를 사용하는 기기는 부팅 이미지 헤더 버전 0을 사용하는 것으로 간주합니다.

struct boot_img_hdr
{
    uint8_t magic[BOOT_MAGIC_SIZE];
    uint32_t kernel_size;                /* size in bytes */
    uint32_t kernel_addr;                /* physical load addr */

    uint32_t ramdisk_size;               /* size in bytes */
    uint32_t ramdisk_addr;               /* physical load addr */

    uint32_t second_size;                /* size in bytes */
    uint32_t second_addr;                /* physical load addr */

    uint32_t tags_addr;                  /* physical addr for kernel tags */
    uint32_t page_size;                  /* flash page size we assume */
    uint32_t unused;
    uint32_t os_version;
    uint8_t name[BOOT_NAME_SIZE];        /* asciiz product name */
    uint8_t cmdline[BOOT_ARGS_SIZE];
    uint32_t id[8];                      /* timestamp / checksum / sha1 / etc */
    uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];
};