Nagłówek obrazu rozruchowego

Android 9 wprowadził pole wersji w nagłówku obrazu rozruchu, co umożliwia aktualizację nagłówka przy zachowaniu zgodności wstecznej. Program rozruchowy musi sprawdzić pole wersji nagłówka i przeanalizować nagłówek odpowiednio się zmienia. Urządzenia z:

  • Android 13 może używać nagłówka rozruchu w wersji 3 lub 4. Dla: urządzenia obsługujące ogólny obraz jądra systemu operacyjnego (GKI) architektura, wersja 4 to podstawowy obraz rozruchowy, os_version w nagłówku rozruchu musi wynosić zero. Program rozruchowy urządzenia powinien uzyskać informacje o wersji z właściwości Android Verified Boot (AVB).
  • Android 12 może używać nagłówka rozruchowego w wersji 3 lub 4. Dla: urządzenia obsługujące ogólny obraz jądra systemu operacyjnego (GKI) architektura, wersja 4 jest podstawowym obrazem rozruchowym.
  • Android 11 może używać nagłówka rozruchowego w wersji 3. Dla: urządzenia obsługujące ogólny obraz jądra systemu operacyjnego (GKI) architektury, ta wersja musi być używana jako podstawowy obraz rozruchowy.
  • Android 10 musi używać nagłówka rozruchowego w wersji 2.
  • Android 9 musi używać wersji 1 nagłówka uruchamiania.
  • Android 8 i starsze wersje są uważane za korzystające z nagłówka obrazu rozruchowego w wersji 0.

Na wszystkich urządzeniach z Androidem 9 lub nowszym Vendor Test Suite (VTS) sprawdza format parametru boot/recovery pozwala upewnić się, że nagłówek obrazu rozruchowego używa prawidłowego wersji. Aby wyświetlić szczegóły AOSP dotyczące każdego obsługiwanego rozruchu i rozruchu dostawcy nagłówków obrazów znajdziesz w dokumentacji, która opisuje system/tools/mkbootimg/include/bootimg/bootimg.h

Wdrożenie wersji nagłówka obrazu rozruchowego

Narzędzie mkbootimg akceptuje te argumenty:

Argument Opis
header_version Ustawia wersję nagłówka obrazu rozruchowego. Obraz rozruchowy z wersją nagłówka:
  • 1 lub 2 obsługuje obraz DTBO przywracania lub obraz ACPIO przywracania.
  • 3 nie obsługuje obrazów przywracania.
recovery_dtbo Używana w przypadku architektur korzystających z przenoszenia danych. Określa ścieżkę do obrazu DTBO służącego do przywracania. Opcjonalny w przypadku urządzeń A/B, które nie wymagają obrazu przywracania. 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 służącego do przywracania.
  • 3 nie może określić obrazu DTBO odzyskiwania.
recovery_acpio Używany w przypadku architektur, które korzystają z ACPI zamiast DTB. Określa ścieżkę z obrazem odzyskiwania ACPIO. Opcjonalny w przypadku urządzeń A/B, które nie wymagają obraz odzyskiwania. Urządzenia inne niż A/B korzystające z header_version:
  • 1 lub 2 może określić tę ścieżkę albo użyć recovery_dtbo w celu określenia ścieżki do obrazu DTBO przywracania.
  • 3 nie można określić obrazu ACPIO do odzyskiwania.
dtb Ścieżka do obrazu DTB widocznego w obrazach rozruchowych/przywracania.
dtb_offset Gdy zostanie dodany do argumentu base, udostępnia adres załadowania fizycznego dla końcowego drzewa urządzeń. Jeśli na przykład argument base to 0x10000000, a argument dtb_offset to 0x01000000, argument dtb_addr_field w nagłówku obrazu rozruchowego jest wypełniany jako 0x11000000.

Urządzenie BoardConfig.mk używa konfiguracji BOARD_MKBOOTIMG_ARGS, aby dodać argument header version do pozostałych argumentów mkbootimg dotyczących konkretnej płytki. 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 Androida używa zmiennej BoardConfig BOARD_PREBUILT_DTBOIMAGE, aby ustawić argument recovery_dtbo funkcji mkbootimg podczas tworzenia obrazu odzyskiwania. Szczegółowe informacje na temat zmian w Android Open Source Project (AOSP), sprawdź powiązane z nimi listy zmian dla nagłówka obrazu rozruchowego obsługi wersji.

Nagłówek obrazu rozruchowego, wersja 4

Android 12 zawiera boot_signature w obrazie rozruchowym w wersji 4 nagłówka, która może służyć do sprawdzania integralności jądra i „ramdisk”. Kontrola jest przeprowadzana za Test VtsSecurityAvbTest i jest wymagany w przypadku urządzeń korzystających z architektury GKI. Jednak boot_signature nie jest używany w procesie weryfikacji podczas uruchamiania na konkretnym urządzeniu i jest używany tylko w VTS. Zobacz tablica informacyjna GKI Boot.img i rozruch zweryfikowany przez GKI ustawienia .

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

Wersja 4 nagłówka obrazu rozruchowego używa tego 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, spowoduje usunięcie tych danych:

  • Program rozruchowy drugiego etapu. Pola second_size i second_addr nie mogą być dłuższe w nagłówku obrazu rozruchowego. Urządzenia z programem rozruchowym drugiego etapu musi zapisać ten program rozruchowy na osobnej partycji.

  • Obraz przywracania. Wymaganie określenia obrazu odzyskiwania zostało wycofane, a pola recovery_dtbo_size, recovery_dtbo_offset, recovery_acpio_sizerecovery_acpio_offset nie pojawiają się już w nagłówku obrazu rozruchowego.

    • Urządzenia A/B używają schematu aktualizacji i przywracania danych, dzięki czemu nie trzeba należy określić obraz DTBO lub ACPIO do przywrócenia.

    • 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.

  • Blob drzewa urządzenia (DTB). DTB jest przechowywany w partycji rozruchu dostawcy, więc pola dtb_sizedtb_addr nie są już widoczne w nagłówku obrazu rozruchu (ale są obecne w nagłówku obrazu rozruchu dostawcy).

Urządzenia mogą używać nagłówka obrazu rozruchowego w wersji 3, aby zachować zgodność z ogólnym obrazem jądra (GKI), ujednolica ono podstawowe jądro i przenosi moduły dostawców wymagane uruchamianie na partycji vendor_boot (co oznacza, że obraz rozruchowy zawiera tylko interfejs GKI). ). Urządzenia, które:

  • Używaj GKI (wymaga jądra systemu Android 4.19 lub Androida 5.4), ale nie używaj Aktualizacje A/B mogą określać obraz przywracania, używając obrazu rozruchowego w wersji 3 dla obrazu rozruchowego i obrazu rozruchowego w wersji 2 dla obrazu przywracania.

  • Nie używaj GKI i nie używaj aktualizacji A/B, aby określić obraz przywracania za pomocą funkcji obraz rozruchowy w wersji 1 lub 2 zarówno dla obrazów rozruchowych, jak i obrazów przywracania.

Wersja 3 nagłówka obrazu rozruchowego używa tego 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];
};

Nagłówek obrazu rozruchowego, wersja 2

Android 10 aktualizuje nagłówek obrazu rozruchowego do wersji 2, z sekcją dotyczącą odzyskiwania DTB informacje o obrazie (rozmiar obrazu) i fizyczny adres obciążenia).

Wersja 2 nagłówka obrazu rozruchowego korzysta z poniższego formatu.

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 pole unused rozruchu do pola wersji nagłówka. Urządzenia z Androidem wprowadzone na rynek 9 musi używać nagłówka obrazu rozruchowego z nagłówkiem wersji ustawionej na 1 lub wyższą (weryfikuje to VTS).

Wersja 1 nagłówka obrazu rozruchowego używa tego formatu.

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

Na urządzeniach innych niż A/B można określić obraz nakładki DTB/ACPI dla przywracanie, które minimalizuje ryzyko niepowodzenie aktualizacji bezprzewodowych (OTA). (urządzenia A/B nie mają tego problemu i nie trzeba określać obrazu nakładki). Możesz podać obraz DTBO lub obraz ACPIO, ale nie oba (ponieważ są one używane przez różne architektury). Aby poprawnie skonfigurować nagłówek obrazu rozruchowego, gdy używasz:

  • obraz DTBO do przywrócenia, zawierający pola recovery_dtbo_size i recovery_dtbo_offset (nie uwzględniaj pól recovery_acpio_size i recovery_acpio_offset);

  • obraz ACPIO przywracania, uwzględnij parametry recovery_acpio_size oraz recovery_acpio_offset (bez uwzględniania pól recovery_dtbo_size i recovery_dtbo_offset pól).

Pole header_size zawiera rozmiar nagłówka obrazu rozruchowego. Jeśli wersja nagłówka obrazu rozruchowego jest ustawiona na 1, pole id zawiera skrót SHA-1 dla sekcji recovery_[dtbo|acpio] obrazu rozruchowego, a także kernel, ramdisksecond sections. Szczegółowe informacje na temat Pola recovery_[dtbo|acpio]_size i recovery_[dtbo|acpio]_offset, patrz Obrazy przywracania.

Starszy nagłówek obrazu rozruchowego, wersja 0

Urządzenia wyprodukowane przed Androidem 9, które korzystają ze starszego nagłówka obrazu rozruchowego, są uznawane za korzystające z wersji nagłówka obrazu rozruchowego 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];
};