Nagłówek obrazu rozruchowego

W systemie Android 9 wprowadzono pole wersji w nagłówku obrazu rozruchowego, umożliwiające aktualizację nagłówka przy jednoczesnym zachowaniu kompatybilności wstecznej. Program ładujący musi sprawdzić pole wersji nagłówka i odpowiednio przeanalizować nagłówek. Urządzenia uruchamiane z:

  • Android 13 może używać nagłówka rozruchowego w wersji 3 lub 4. W przypadku urządzeń obsługujących architekturę Generic Kernel Image (GKI) , wersja 4 jest podstawowym obrazem rozruchowym, a pole os_version w nagłówku rozruchowym musi mieć wartość zero. Oczekuje się, że program ładujący urządzenia uzyska zamiast tego informacje o wersji z właściwości Android Verified Boot (AVB) .
  • Android 12 może korzystać z nagłówka rozruchowego w wersji 3 lub 4. W przypadku urządzeń obsługujących architekturę Generic Kernel Image (GKI) wersja 4 jest podstawowym obrazem rozruchowym.
  • Android 11 może korzystać z nagłówka rozruchowego w wersji 3. W przypadku urządzeń obsługujących architekturę Generic Kernel Image (GKI) ta wersja musi być używana jako główny obraz rozruchowy.
  • Android 10 musi używać nagłówka rozruchowego w wersji 2.
  • Android 9 musi używać nagłówka rozruchowego w wersji 1.
  • Uważa się, że Android 8 i starsze wersje korzystają z nagłówka obrazu rozruchowego w wersji 0.

W przypadku wszystkich urządzeń z systemem Android 9 lub nowszym pakiet Vendor Test Suite (VTS) sprawdza format obrazu boot/recovery , aby upewnić się, że nagłówek obrazu rozruchowego używa prawidłowej wersji. Aby wyświetlić szczegóły AOSP dotyczące wszystkich aktualnie obsługiwanych nagłówków obrazu rozruchowego i obrazu rozruchowego dostawcy, zobacz system/tools/mkbootimg/include/bootimg/bootimg.h .

Implementowanie wersji nagłówka obrazu rozruchowego

Narzędzie mkbootimg akceptuje następujące argumenty.

Argument Opis
header_version Ustawia wersję nagłówka obrazu rozruchowego. Obraz rozruchowy z wersją nagłówka:
  • 1 lub 2 obsługuje obraz odzyskiwania DTBO lub obraz odzyskiwania ACPIO.
  • 3 nie obsługuje obrazów odzyskiwania.
recovery_dtbo Używany w architekturach korzystających z DTB. Określa ścieżkę do obrazu DTBO odzyskiwania. Opcjonalnie dla urządzeń A/B, które nie wymagają obrazu odzyskiwania. Urządzenia inne niż A/B korzystające z header_version :
  • 1 lub 2 mogą określić tę ścieżkę lub użyć sekcji recovery_acpio , aby określić ścieżkę do obrazu ACPIO odzyskiwania.
  • 3 nie można określić obrazu DTBO odzyskiwania.
recovery_acpio Używany w architekturach korzystających z ACPI zamiast DTB. Określa ścieżkę do obrazu ACPIO odzyskiwania. Opcjonalnie dla urządzeń A/B, które nie wymagają obrazu odzyskiwania. Urządzenia inne niż A/B korzystające z header_version :
  • 1 lub 2 mogą określić tę ścieżkę lub użyć sekcji recovery_dtbo , aby określić ścieżkę do obrazu DTBO odzyskiwania.
  • 3 nie można określić obrazu ACPIO odzyskiwania.
dtb Ścieżka do obrazu DTB zawartego w obrazach rozruchowych/odzyskiwania.
dtb_offset Po dodaniu do argumentu base zapewnia adres obciążenia fizycznego dla końcowego drzewa urządzeń. Na przykład, jeśli argument base to 0x10000000 , a argument dtb_offset to 0x01000000 , pole dtb_addr_field w nagłówku obrazu rozruchowego jest wypełniane jako 0x11000000 .

Urządzenie BoardConfig.mk używa konfiguracji BOARD_MKBOOTIMG_ARGS , aby dodać header version do innych argumentów specyficznych dla płyty mkbootimg . Na przykład:

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

System kompilacji systemu Android używa zmiennej BoardConfig BOARD_PREBUILT_DTBOIMAGE do ustawienia argumentu recovery_dtbo narzędzia mkbootimg podczas tworzenia obrazu odzyskiwania. Aby uzyskać szczegółowe informacje na temat zmian w projekcie Android Open Source Project (AOSP), przejrzyj powiązane listy zmian dotyczące wersji nagłówka obrazu rozruchowego .

Nagłówek obrazu rozruchowego, wersja 4

Android 12 udostępnia boot_signature w nagłówku obrazu rozruchowego w wersji 4, którego można użyć do sprawdzenia integralności jądra i ramdysku. Sprawdzanie odbywa się w VtsSecurityAvbTest i jest wymagane w przypadku urządzeń korzystających z architektury GKI. Jednak boot_signature nie jest zaangażowany w proces zweryfikowanego rozruchu specyficznego dla urządzenia i jest używany tylko w VTS. Aby uzyskać szczegółowe informacje, zobacz konfigurację płyty GKI boot.img i zweryfikowane przez GKI ustawienia rozruchu .

Nagłówek obrazu rozruchowego dostawcy w wersji 4 obsługuje wiele fragmentów RAMdysku dostawcy.

Wersja 4 nagłówka obrazu rozruchowego używa następującego formatu.

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 */
};

Nagłówek obrazu rozruchowego, wersja 3

Android 11 aktualizuje nagłówek obrazu rozruchowego do wersji 3, która usuwa następujące dane:

  • Program ładujący drugiego stopnia. Pola second_size i second_addr nie pojawiają się już w nagłówku obrazu rozruchowego. Urządzenia z programem ładującym drugiego stopnia muszą przechowywać ten program ładujący na własnej partycji.

  • Obraz odzyskiwania. Wymaganie określania obrazu odzyskiwania zostało uznane za przestarzałe, a pola recovery_dtbo_size , recovery_dtbo_offset , recovery_acpio_size i recovery_acpio_offset nie pojawiają się już w nagłówku obrazu rozruchowego.

    • Urządzenia A/B korzystają ze schematu aktualizacji i odzyskiwania, który sprawia, że ​​nie jest konieczne określanie obrazu DTBO lub ACPIO do odzyskiwania.

    • Urządzenia inne niż A/B, które chcą określić obraz odzyskiwania (DTBO lub ACPIO), powinny używać nagłówka obrazu rozruchowego w wersji 1 lub 2.

  • Obiekt blob drzewa urządzeń (DTB). Plik DTB jest przechowywany na partycji rozruchowej dostawcy , więc pola dtb_size i dtb_addr nie pojawiają się już w nagłówku obrazu rozruchowego (ale są obecne w nagłówku obrazu rozruchowego dostawcy).

Urządzenia mogą używać nagłówka obrazu rozruchowego w wersji 3, aby zachować zgodność z architekturą Generic Kernel Image (GKI) , która ujednolica jądro rdzenia i przenosi moduły dostawcy wymagane do rozruchu na partycję vendor_boot (co oznacza, że ​​obraz startowy zawiera tylko komponenty GKI). Urządzenia, które:

  • Użyj GKI (wymaga jądra systemu Android-4.19 lub Android-5.4), ale nie używaj aktualizacji A/B. Możesz określić obraz odzyskiwania, używając obrazu rozruchowego w wersji 3 jako obrazu rozruchowego i obrazu rozruchowego w wersji 2 jako obrazu odzyskiwania.

  • Nie używaj GKI i nie korzystaj z aktualizacji A/B. Możesz określić obraz odzyskiwania, używając obrazu rozruchowego w wersji 1 lub 2 zarówno dla obrazu rozruchowego, jak i odzyskiwania.

Wersja 3 nagłówka obrazu rozruchowego ma następujący format.

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];
};

Nagłówek obrazu rozruchowego, wersja 2

Android 10 aktualizuje nagłówek obrazu rozruchowego do wersji 2, która dodaje sekcję zawierającą informacje o obrazie DTB odzyskiwania (rozmiar obrazu i adres obciążenia fizycznego).

Wersja 2 nagłówka obrazu rozruchowego ma następujący format.

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 */
};

Nagłówek obrazu rozruchowego, wersja 1

Android 9 konwertuje unused pole nagłówka obrazu rozruchowego na pole wersji nagłówka. Urządzenia uruchamiane z systemem Android 9 muszą używać nagłówka obrazu rozruchowego z wersją nagłówka ustawioną na 1 lub wyższą (jest to weryfikowane przez VTS).

Wersja 1 nagłówka obrazu rozruchowego ma następujący format.

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 */
};

Urządzenia inne niż A/B mogą określić obraz nakładki DTB/ACPI do odzyskania , aby pomóc w ograniczeniu błędów aktualizacji OTA. (Urządzenia A/B nie mają tego problemu i nie muszą określać obrazu nakładki.) Można określić obraz DTBO lub obraz ACPIO, ale nie oba (ponieważ są one używane w różnych architekturach). Aby poprawnie skonfigurować nagłówek obrazu rozruchowego, podczas korzystania z:

  • Obraz DTBO do odzyskiwania zawiera pola recovery_dtbo_size i recovery_dtbo_offset (bez pól recovery_acpio_size i recovery_acpio_offset ).

  • Obraz ACPIO do odzyskiwania zawiera pola recovery_acpio_size i recovery_acpio_offset (bez pól recovery_dtbo_size i recovery_dtbo_offset ).

Pole header_size zawiera rozmiar nagłówka obrazu rozruchowego. Jeśli wersja nagłówka obrazu startowego jest ustawiona na 1, pole id zawiera skrót SHA-1 dla sekcji recovery_[dtbo|acpio] obrazu startowego, oprócz kernel , ramdisk i second sections . Aby uzyskać szczegółowe informacje na temat pól recovery_[dtbo|acpio]_size i recovery_[dtbo|acpio]_offset , zobacz Obrazy odzyskiwania .

Nagłówek starszego obrazu rozruchowego, wersja 0

Urządzenia uruchomione przed systemem Android 9 i korzystające ze starszego nagłówka obrazu rozruchowego są uznawane za urządzenia korzystające z nagłówka obrazu rozruchowego w wersji 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];
};