부팅 이미지 헤더

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

Android 9에서는 부팅 이미지 헤더에 버전 필드를 도입하여 이전 버전과의 호환성을 유지하면서 헤더를 업데이트할 수 있습니다. 부트로더는 헤더 버전 필드를 확인하고 그에 따라 헤더를 구문 분석해야 합니다. 다음으로 출시되는 기기:

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

Android 9 이상을 실행하는 모든 기기의 경우 VTS(Vendor Test Suite)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 장치는 mkbootimg 구성을 사용하여 BOARD_MKBOOTIMG_ARGS 의 다른 보드별 인수에 header version 을 추가합니다. 예를 들어:

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_sizerecovery_acpio_offset 필드가 더 이상 부팅 이미지 헤더에 표시되지 않습니다.

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

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

  • DTB(장치 트리 blob). DTB는 공급업체 부팅 파티션 에 저장되므로 dtb_sizedtb_addr 필드는 더 이상 부팅 이미지 헤더에 나타나지 않습니다(그러나 공급업체 부팅 이미지 헤더에는 있음).

장치는 부팅 이미지 헤더 버전 3을 사용하여 GKI(Generic Kernel Image) 아키텍처를 준수할 수 있습니다. 이 아키텍처는 핵심 커널을 통합하고 부팅에 필요한 공급업체 모듈을 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 장치는 OTA(무선 업데이트) 업데이트 실패를 완화하는 데 도움이 되도록 복구용 DTB/ACPI 오버레이 이미지를 지정할 수 있습니다. (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 , ramdisksecond 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];
};