W Androidzie 9 wprowadzono pole wersji w obrazie rozruchowym umożliwia aktualizowanie nagłówka przy zachowaniu zgodności wstecznej. Bootloader musi sprawdzić pole wersji nagłówka i odpowiednio zanalizować nagłówek. Urządzenia uruchamiane z:
- Android 13 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 to podstawowy obraz rozruchowy,
os_version
. w nagłówku rozruchu musi wynosić zero. Program rozruchowy urządzenia powinien uzyskać informacje o wersji z narzędzia do weryfikacji podczas uruchamiania Androida (AVB), właściwości. - 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ć nagłówka rozruchowego w wersji 1.
- Android 8 i starsze wersje są uważane za korzystające z nagłówka obrazu rozruchowego w wersji 0.
W przypadku wszystkich urządzeń z Androidem 9 lub nowszym pakiet testów dostawcy (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 obrazu rozruchu i obrazu rozruchu dostawcy, zapoznaj się z dokumentem system/tools/mkbootimg/include/bootimg/bootimg.h
.
Wdrażanie obsługi 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żywana w przypadku architektur korzystających z przenoszenia danych. Określa ścieżkę przywracania
Obraz DTBO. Opcjonalne w przypadku urządzeń A/B, które nie potrzebują obrazu do przywracania.
Urządzenia inne niż A/B korzystające z header_version :
|
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 :
|
dtb |
Ścieżka do obrazu DTB widocznego w obrazach rozruchowych/przywracania. |
dtb_offset |
Dodanie go do argumentu base powoduje obciążenie fizyczne
ostatniego drzewa urządzeń. Jeśli na przykład base
to 0x10000000 , a argument dtb_offset
to 0x01000000 , dtb_addr_field w obrazie rozruchowym
nagłówek jest wypełniany jako 0x11000000 . |
Urządzenie BoardConfig.mk
używa konfiguracji BOARD_MKBOOTIMG_ARGS
, aby dodać
header version
do innych argumentów tablicy mkbootimg
. Dla:
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 ustawiania argumentu recovery_dtbo
narzędzia 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 uczestniczy w procesie weryfikacji podczas uruchamiania konkretnego urządzenia
i jest używane tylko w VTS. Więcej informacji znajdziesz w konfiguracji pliku boot.img płyty głównej GKI i ustawieniach weryfikacji podczas uruchamiania GKI.
Obraz rozruchowy dostawcy nagłówek wersja 4 obsługuje wiele fragmentów dysku ramdisk dostawców.
Wersja 4 nagłówka obrazu rozruchowego korzysta z poniższego 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
isecond_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
recovery_dtbo_size
,recovery_dtbo_offset
, Polarecovery_acpio_size
irecovery_acpio_offset
nie są już wyświetlane w 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 przywracania (DTBO lub ACPIO) powinien używać nagłówka obrazu rozruchowego w wersji 1 lub 2.
Blob drzewa urządzenia (DTB). Plik przenoszenia danych jest przechowywany w pliku rozruchowym dostawcy partycja, więc pola
dtb_size
idtb_addr
nie są już widoczne w obrazie rozruchowym w nagłówku (ale znajdują się w nagłówku obrazu rozruchowego 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 korzysta z poniższego 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
nagłówka obrazu rozruchowego na pole 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 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 */
};
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). (na urządzeniach A/B ten problem nie występuje, nie trzeba określać obrazu nad powierzchnią). Możesz podać obraz DTBO lub obrazu ACPIO, ale nie na oba te sposoby (bo są używane przez różne architektury). Aby prawidłowo skonfigurować nagłówek obrazu rozruchowego, gdy używasz:
Obraz DTBO na potrzeby przywracania, dołącz elementy
recovery_dtbo_size
irecovery_dtbo_offset
(bez uwzględniania pólrecovery_acpio_size
irecovery_acpio_offset
pól).obraz ACPIO do przywrócenia, zawierający pola
recovery_acpio_size
irecovery_acpio_offset
(nie uwzględniaj pólrecovery_dtbo_size
irecovery_dtbo_offset
);
Pole header_size
zawiera rozmiar nagłówka obrazu rozruchowego. Jeśli podczas uruchamiania
wersja nagłówka obrazu jest ustawiona na 1, pole id
zawiera skrót SHA-1 dla
recovery_[dtbo|acpio]
obrazu rozruchowego, a także
kernel
, ramdisk
i second sections
. Szczegółowe informacje na temat
Pola recovery_[dtbo|acpio]_size
i recovery_[dtbo|acpio]_offset
, patrz
Obrazy przywracania.
Nagłówek starszej wersji obrazu rozruchowego, wersja 0
Urządzenia wprowadzone na rynek przed Androidem 9 ze starszą wersją nagłówek obrazu rozruchowego jest uważany za używanie 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];
};