W Androidzie 9 wprowadzono pole wersji w nagłówku obrazu rozruchowego, co umożliwia aktualizowanie nagłówka przy zachowaniu zgodności wstecznej. Program rozruchowy musi sprawdzić pole wersji nagłówka i odpowiednio przeanalizować nagłówek. Urządzenia wprowadzane na rynek 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 głównym obrazem rozruchowym, a pole
os_version
w nagłówku rozruchowym musi mieć wartość zero. Oczekuje się, że program rozruchowy urządzenia będzie pobierać informacje o wersji z właściwości weryfikacji podczas uruchamiania w Androidzie (AVB). - Android 12 może używać nagłówka rozruchowego w wersji 3 lub 4. W przypadku urządzeń obsługujących architekturę ogólnego obrazu jądra (GKI) głównym obrazem rozruchowym jest wersja 4.
- Android 11 może używać wersji 3 nagłówka rozruchowego. W przypadku urządzeń obsługujących architekturę ogólnego obrazu jądra (GKI) 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ć nagłówka rozruchowego w wersji 1.
- Android 8 i starsze wersje są traktowane jako korzystające z nagłówka obrazu rozruchowego w wersji 0.
W przypadku wszystkich urządzeń z Androidem 9 lub nowszym 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 obsługiwanych nagłówków obrazów rozruchowych i rozruchowych dostawcy, zapoznaj się z tym system/tools/mkbootimg/include/bootimg/bootimg.h
.
Wdrażanie 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:
|
recovery_dtbo |
Używany w przypadku architektur korzystających z DTB. Określa ścieżkę do obrazu DTBO przywracania. Opcjonalne w przypadku urządzeń A/B, które nie wymagają obrazu odzyskiwania.
Urządzenia inne niż A/B korzystające z header_version :
|
recovery_acpio |
Używany w przypadku architektur, które zamiast DTB używają ACPI. Określa ścieżkę do obrazu ACPIO odzyskiwania. Opcjonalne w przypadku urządzeń A/B, które nie wymagają obrazu odzyskiwania. Urządzenia inne niż A/B korzystające z header_version :
|
dtb |
Ścieżka do obrazu DTB, który jest zawarty w obrazach rozruchowych lub przywracania. |
dtb_offset |
Po dodaniu do argumentu base podaje adres fizyczny
węzła końcowego w drzewie urządzeń. Jeśli na przykład argument base to 0x10000000 , a argument dtb_offset to 0x01000000 , w nagłówku obrazu rozruchowego dtb_addr_field zostanie wpisana wartość 0x11000000 . |
Urządzenie BoardConfig.mk
używa konfiguracji BOARD_MKBOOTIMG_ARGS
, aby dodać header version
do innych argumentów specyficznych dla płyty w funkcji mkbootimg
. 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
do ustawienia argumentu recovery_dtbo
narzędzia mkbootimg
podczas tworzenia obrazu odzyskiwania. Szczegółowe informacje o zmianach w Android Open Source Project (AOSP) znajdziesz w powiązanych listach zmian dotyczących 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 dysku RAM. Sprawdzanie odbywa się w VtsSecurityAvbTest i jest wymagane w przypadku urządzeń korzystających z architektury GKI. Nie jest on jednak zaangażowany w proces weryfikacji podczas uruchamiania urządzenia i jest używany tylko w VTS.boot_signature
Więcej informacji znajdziesz w sekcjach Konfiguracja płyty boot.img GKI i Ustawienia weryfikacji podczas uruchamiania GKI.
Obraz rozruchowy dostawcy w wersji 4 obsługuje wiele fragmentów dysku RAM dostawcy.
Wersja 4 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];
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 te dane:
Program rozruchowy drugiego etapu. Pola
second_size
isecond_addr
nie są już wyświetlane w nagłówku obrazu rozruchowego. Urządzenia z programem rozruchowym drugiego etapu muszą przechowywać ten program rozruchowy we własnej partycji.Obraz przywracania Wymóg podania obrazu odzyskiwania został wycofany, a pola
recovery_dtbo_size
,recovery_dtbo_offset
,recovery_acpio_size
irecovery_acpio_offset
nie pojawiają się już w nagłówku obrazu rozruchowego.Urządzenia A/B korzystają ze schematu aktualizacji i przywracania, który sprawia, że nie trzeba określać obrazu DTBO ani ACPIO na potrzeby przywracania.
Urządzenia inne niż A/B, które chcą określić obraz odzyskiwania (DTBO lub ACPIO), powinny używać wersji 1 lub 2 nagłówka obrazu rozruchowego.
Plik binarny drzewa urządzeń (DTB). DTB jest przechowywany w partycji rozruchowej dostawcy, więc pola
dtb_size
idtb_addr
nie pojawiają się już w nagłówku obrazu rozruchowego (ale są obecne w nagłówku obrazu rozruchowego dostawcy).
Urządzenia mogą używać wersji 3 nagłówka obrazu rozruchowego, aby zachować zgodność z architekturą ogólnego obrazu jądra (GKI), która ujednolica jądro i przenosi moduły dostawcy wymagane do uruchomienia na partycję vendor_boot
(co oznacza, że obraz rozruchowy zawiera tylko komponenty GKI). Urządzenia, które:
Używaj GKI (wymaga jądra android-4.19 lub android-5.4), ale nie używaj aktualizacji A/B. Obraz odzyskiwania można określić, używając obrazu rozruchowego w wersji 3 dla obrazu rozruchowego i obrazu rozruchowego w wersji 2 dla obrazu odzyskiwania.
Nie używaj GKI ani aktualizacji A/B. Obraz odzyskiwania możesz określić, używając wersji 1 lub 2 obrazu rozruchowego zarówno w przypadku obrazu rozruchowego, jak i obrazu 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ę informacji o obrazie DTB odzyskiwania (rozmiar obrazu i fizyczny adres ładowania).
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 przekształca pole unused
w nagłówku obrazu rozruchowego w pole wersji nagłówka. Urządzenia wprowadzane na rynek z Androidem 9 muszą używać nagłówka obrazu rozruchowego z ustawioną wersją nagłówka 1 lub nowszą (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ślać obraz nakładki DTB/ACPI na potrzeby przywracania, aby zapobiegać niepowodzeniom aktualizacji OTA. (Urządzenia A/B nie mają tego problemu i nie muszą określać obrazu nakładki). Możesz określić obraz DTBO lub obraz ACPIO, ale nie oba jednocześnie (ponieważ są używane przez różne architektury). Aby prawidłowo skonfigurować nagłówek obrazu rozruchowego, w przypadku korzystania z:
Obraz DTBO na potrzeby odzyskiwania, uwzględnij pola
recovery_dtbo_size
irecovery_dtbo_offset
(nie uwzględniaj pólrecovery_acpio_size
irecovery_acpio_offset
).Obraz ACPIO na potrzeby odzyskiwania, uwzględnij pola
recovery_acpio_size
irecovery_acpio_offset
(nie dodawaj pólrecovery_dtbo_size
irecovery_dtbo_offset
).
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 sekcji recovery_[dtbo|acpio]
obrazu rozruchowego, a także sekcje kernel
, ramdisk
i second sections
. Szczegółowe informacje o polach recovery_[dtbo|acpio]_size
i recovery_[dtbo|acpio]_offset
znajdziesz w sekcji Obrazy przywracania.
Nagłówek starszej wersji obrazu rozruchowego, wersja 0
Urządzenia wprowadzone na rynek przed Androidem 9, które używają starszego nagłówka obrazu rozruchowego, są traktowane jako urządzenia z nagłówkiem 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];
};