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 | 부팅 이미지 헤더 버전을 설정합니다. 헤더 버전이 있는 부팅 이미지:
|
recovery_dtbo | DTB를 사용하는 아키텍처에 사용됩니다. 복구 DTBO 이미지의 경로를 지정합니다. 복구 이미지가 필요하지 않은 A/B 기기의 경우 선택 사항입니다. header_version 을 사용하는 비 A/B 기기:
|
recovery_acpio | DTB 대신 ACPI를 사용하는 아키텍처에 사용됩니다. 복구 ACPIO 이미지의 경로를 지정합니다. 복구 이미지가 필요하지 않은 A/B 기기의 경우 선택 사항입니다. header_version 을 사용하는 비 A/B 기기:
|
dtb | 부팅/복구 이미지에 포함된 DTB 이미지의 경로입니다. |
dtb_offset | base 인수에 추가되면 최종 장치 트리에 대한 물리적 로드 주소를 제공합니다. 예를 들어 base 인수가 0x10000000 이고 dtb_offset 인수가 0x01000000 이면 부팅 이미지 헤더의 dtb_addr_field 가 0x11000000 으로 채워집니다. |
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_size
및second_addr
필드는 더 이상 부팅 이미지 헤더에 표시되지 않습니다. 2단계 부트로더가 있는 장치는 해당 부트로더를 자체 파티션에 저장해야 합니다.복구 이미지입니다. 복구 이미지를 지정하기 위한 요구 사항은 더 이상 사용되지 않으며,
recovery_dtbo_size
,recovery_dtbo_offset
,recovery_acpio_size
및recovery_acpio_offset
필드가 더 이상 부팅 이미지 헤더에 표시되지 않습니다.A/B 장치는 복구를 위해 DTBO 또는 ACPIO 이미지를 지정할 필요가 없도록 하는 업데이트 및 복구 체계를 사용합니다.
복구 이미지(DTBO 또는 ACPIO)를 지정하려는 비 A/B 장치는 부팅 이미지 헤더 버전 1 또는 2를 사용해야 합니다.
DTB(장치 트리 blob). DTB는 공급업체 부팅 파티션 에 저장되므로
dtb_size
및dtb_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_size
및recovery_dtbo_offset
필드가 포함됩니다(recovery_acpio_size
및recovery_acpio_offset
필드는 포함하지 않음).복구를 위한 ACPIO 이미지에는
recovery_acpio_size
및recovery_acpio_offset
필드가 포함됩니다(recovery_dtbo_size
및recovery_dtbo_offset
필드는 포함하지 않음).
header_size
필드에는 부팅 이미지 헤더의 크기가 포함됩니다. 부팅 이미지 헤더 버전이 1로 설정된 경우 id
필드에는 kernel
, ramdisk
및 second sections
외에 부팅 이미지의 recovery_[dtbo|acpio]
섹션에 대한 SHA-1 다이제스트가 포함됩니다. recovery_[dtbo|acpio]_size
및 recovery_[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];
};