W Androidzie 11 pojawiła się koncepcja ogólnego jądra
Obraz (GKI). Aby umożliwić uruchamianie dowolnego urządzenia przy użyciu interfejsu GKI, Android
11 urządzeń może używać nagłówka obrazu rozruchowego w wersji 3. W
wersji 3, wszystkie informacje dotyczące konkretnego dostawcy są pomijane w boot
i przeniesione do nowej partycji vendor_boot
. urządzenie z architekturą ARM64,
podczas uruchamiania systemu Android 11 z jądrem systemu Linux 5.4
obsługują partycję vendor_boot
i zaktualizowany format partycji boot
na
zalicza testy w GKI.
Urządzenia z Androidem 12 mogą używać nagłówka obrazu rozruchowego w wersji 4,
który umożliwia uwzględnienie wielu dysków RAM dostawców w pliku vendor_boot
partycji danych. Wiele fragmentów ramdysk dostawcy jest połączonych jeden po drugim
w sekcji „Ramdisk dostawcy”. Tabela Ramdisk dostawcy służy do opisania
układ sekcji RAMdysk dostawcy i metadanych każdego z nich dostawcy.
fragment.
Struktura partycji
Partycja rozruchowa dostawcy jest oznaczona jako A/B przy użyciu wirtualnych wersji A/B i chroniona przez Androida. Weryfikacja podczas uruchamiania.
Wersja 3
Partycja składa się z nagłówka, dysku Ramdisk dostawcy i bloba drzewa urządzenia. (DTB).
Sekcja | Liczba stron |
---|---|
Nagłówek rozruchowy dostawcy (liczba stron: n) | n = (2112 + page_size - 1) / page_size |
Plik Ramdisk dostawcy (strony O) | o = (vendor_ramdisk_size + page_size - 1) / page_size |
DTB (strony: p) | p = (dtb_size + page_size - 1) / page_size |
Wersja 4
Partycja składa się z nagłówka, sekcji pamięci RAM dostawcy (składa się z wszystkie połączone fragmenty ramdysk dostawcy, blob drzewa urządzeń (DTB) oraz tabeli Ramdisk dostawcy.
Sekcja | Liczba stron |
---|---|
Nagłówek rozruchowy dostawcy (liczba stron: n) | n = (2128 + page_size - 1) / page_size |
Fragmenty ramdisk dostawcy (liczba stron: ) | o = (vendor_ramdisk_size + page_size - 1) / page_size |
DTB (strony: p) | p = (dtb_size + page_size - 1) / page_size |
Tabela ramdisk dostawcy (strony Q) | q = (vendor_ramdisk_table_size + page_size - 1) / page_size |
Bootconfig (strony R) | r = (bootconfig_size + page_size - 1) / page_size |
Nagłówek rozruchowy dostawcy
Zawartość nagłówka partycji rozruchowej dostawcy składa się głównie z danych przeniesione tam z nagłówek obrazu rozruchowego. it .
Wersja 3
struct vendor_boot_img_hdr_v3
{
#define VENDOR_BOOT_MAGIC_SIZE 8
uint8_t magic[VENDOR_BOOT_MAGIC_SIZE];
uint32_t header_version;
uint32_t page_size; /* flash page size we assume */
uint32_t kernel_addr; /* physical load addr */
uint32_t ramdisk_addr; /* physical load addr */
uint32_t vendor_ramdisk_size; /* size in bytes */
#define VENDOR_BOOT_ARGS_SIZE 2048
uint8_t cmdline[VENDOR_BOOT_ARGS_SIZE];
uint32_t tags_addr; /* physical addr for kernel tags */
#define VENDOR_BOOT_NAME_SIZE 16
uint8_t name[VENDOR_BOOT_NAME_SIZE]; /* asciiz product name */
uint32_t header_size; /* size of vendor boot image header in
* bytes */
uint32_t dtb_size; /* size of dtb image */
uint64_t dtb_addr; /* physical load address */
};
Wersja 4
struct vendor_boot_img_hdr_v4
{
#define VENDOR_BOOT_MAGIC_SIZE 8
uint8_t magic[VENDOR_BOOT_MAGIC_SIZE];
uint32_t header_version;
uint32_t page_size; /* flash page size we assume */
uint32_t kernel_addr; /* physical load addr */
uint32_t ramdisk_addr; /* physical load addr */
uint32_t vendor_ramdisk_size; /* size in bytes */
#define VENDOR_BOOT_ARGS_SIZE 2048
uint8_t cmdline[VENDOR_BOOT_ARGS_SIZE];
uint32_t tags_addr; /* physical addr for kernel tags */
#define VENDOR_BOOT_NAME_SIZE 16
uint8_t name[VENDOR_BOOT_NAME_SIZE]; /* asciiz product name */
uint32_t header_size; /* size of vendor boot image header in
* bytes */
uint32_t dtb_size; /* size of dtb image */
uint64_t dtb_addr; /* physical load address */
uint32_t vendor_ramdisk_table_size; /* size in bytes for the vendor ramdisk table */
uint32_t vendor_ramdisk_table_entry_num; /* number of entries in the vendor ramdisk table */
uint32_t vendor_ramdisk_table_entry_size; /* size in bytes for a vendor ramdisk table entry */
uint32_t bootconfig_size; /* size in bytes for the bootconfig section */
};
#define VENDOR_RAMDISK_TYPE_NONE 0
#define VENDOR_RAMDISK_TYPE_PLATFORM 1
#define VENDOR_RAMDISK_TYPE_RECOVERY 2
#define VENDOR_RAMDISK_TYPE_DLKM 3
struct vendor_ramdisk_table_entry_v4
{
uint32_t ramdisk_size; /* size in bytes for the ramdisk image */
uint32_t ramdisk_offset; /* offset to the ramdisk image in vendor ramdisk section */
uint32_t ramdisk_type; /* type of the ramdisk */
#define VENDOR_RAMDISK_NAME_SIZE 32
uint8_t ramdisk_name[VENDOR_RAMDISK_NAME_SIZE]; /* asciiz ramdisk name */
#define VENDOR_RAMDISK_TABLE_ENTRY_BOARD_ID_SIZE 16
// Hardware identifiers describing the board, soc or platform which this
// ramdisk is intended to be loaded on.
uint32_t board_id[VENDOR_RAMDISK_TABLE_ENTRY_BOARD_ID_SIZE];
};
vendor_ramdisk_size
to łączny rozmiar wszystkich fragmentów pamięci RAM dostawcy.ramdisk_type
określa typ dysku ramdy. Możliwe wartości to:VENDOR_RAMDISK_TYPE_NONE
oznacza, że wartość jest nieokreślona.VENDOR_RAMDISK_TYPE_PLATFORM
dysk ramdy zawiera bity właściwe dla platformy. Program rozruchowy musi zawsze wczytywać je do pamięci.VENDOR_RAMDISK_TYPE_RECOVERY
dysk RAM zawiera zasoby przywracania. program rozruchowy musi wczytać je do pamięci podczas uruchamiania systemu przywracania.VENDOR_RAMDISK_TYPE_DLKM
dysk ramdy zawiera dynamiczne wczytywalne jądro modułów.
ramdisk_name
to niepowtarzalna nazwa dysku ramdysk.board_id
to wektor identyfikatorów sprzętowych definiowanych przez dostawcę.
Obsługa programu rozruchowego
Ponieważ partycja rozruchowa dostawcy zawiera informacje (takie jak rozmiar strony w formacie Flash, jądra systemu, adresy wczytywania Ramdisk czy plik DTB), które wcześniej istniały w w partycji rozruchowej, program rozruchowy musi mieć dostęp zarówno do partycje muszą mieć wystarczającą ilość danych do ukończenia rozruchu.
Program rozruchowy musi załadować ogólny dysk RAM do pamięci natychmiast po
na dysku ramdisk dostawcy (formaty CPIO, Gzip i LZ4 obsługują ten typ
konkatenacja). Nie wyrównywaj strony z ogólnym obrazem dysku RAM ani nie wprowadzaj żadnego
między nim a końcem dysku RAM dostawcy w pamięci. Po
jądro dekompresuje, wyodrębnia połączony plik do pliku initramfs
,
co daje strukturę pliku, która jest ogólnym plikiem ramdisk nałożonym na
strukturę pliku Ramdisk dostawcy.
Ogólny ramdysk i ramdysk dostawcy są łączone, więc muszą znajdować się taki sam format. Obraz rozruchowy GKI korzysta z ogólnego pliku RAM skompresowanego w formacie LZ4, urządzenie zgodne z GKI musi korzystać z pliku ramdisk dostawcy skompresowanego w formacie lz4. jego konfigurację znajdziesz poniżej.
Wymagania programu rozruchowego dotyczące obsługi rozruchu zostały objaśnione w Wdrożenie Bootconfig.
Wiele dysków RAM dostawców (wersja 4)
Jeśli używasz nagłówka obrazu rozruchowego w wersji 4, program rozruchowy może wybrać podzbiór
wszystkie pliki pamięci RAM dostawcy, które są wczytywane jako initramfs
podczas rozruchu.
Tabela ramdisk dostawcy zawiera metadane każdego dysku RAM. Może ułatwić
programu rozruchowego podczas wybierania dysków RAM do załadowania. Program rozruchowy może określić
do wczytywania dysków RAM wybranych dostawców, o ile tylko ogólny
jako ostatni.
Program rozruchowy może na przykład pominąć ładowanie dysków RAM typu dostawcy
VENDOR_RAMDISK_TYPE_RECOVERY
podczas normalnego uruchamiania, aby oszczędzać zasoby, więc tylko
pliki pamięci RAM dostawcy typu VENDOR_RAMDISK_TYPE_PLATFORM
oraz
Obiekty VENDOR_RAMDISK_TYPE_DLKM
zostały wczytane do pamięci. Z drugiej strony dostawca
dyski RAM typu VENDOR_RAMDISK_TYPE_PLATFORM
, VENDOR_RAMDISK_TYPE_RECOVERY
i VENDOR_RAMDISK_TYPE_DLKM
są ładowane do pamięci podczas uruchamiania systemu przywracania
i trybu uzyskiwania zgody.
Program rozruchowy może też zignorować tabelę Ramdisk dostawcy i wczytać
i całej sekcji pamięci RAM dostawcy. Ma to taki sam efekt jak wczytywanie wszystkich
fragmentami pamięci RAM dostawcy w partycji vendor_boot
.
Pomoc przy tworzeniu
Aby wdrożyć na urządzeniu obsługę uruchamiania dostawcy:
Ustaw
BOARD_BOOT_HEADER_VERSION
na wartość3
lub większą.Ustaw
BOARD_RAMDISK_USE_LZ4
natrue
, jeśli Twoje urządzenie jest zgodne z GKI lub w przeciwnym razie korzysta z ogólnego pliku ramdisk skompresowanego za pomocą algorytmu lz4.Ustaw
BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE
na odpowiedni rozmiar urządzenia, biorąc pod uwagę moduły jądra, które muszą znajdować się w dysku pamięci RAM dostawcy.Zaktualizuj pole
AB_OTA_PARTITIONS
, aby uwzględnić elementvendor_boot
i wszystkie odpowiednie dla tego dostawcy listy partycji OTA na urządzeniu.Skopiuj urządzenie
fstab
do usługi/first_stage_ramdisk
w:vendor_boot
partycji danych, a nieboot
. Przykład:$(LOCAL_PATH)/fstab.hardware:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/first_stage_ramdisk/fstab.$(PRODUCT_PLATFORM)
Aby uwzględnić w pliku vendor_boot
więcej plików pamięci RAM różnych dostawców:
- Ustaw
BOARD_BOOT_HEADER_VERSION
na4
. Ustaw
BOARD_VENDOR_RAMDISK_FRAGMENTS
na listę pamięci RAMdysk logicznego dostawcy nazwy fragmentów do uwzględnienia w poluvendor_boot
.Aby dodać gotowy dysk Ramdisk dostawcy, ustaw
BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).PREBUILT
do gotowego rozwiązania ścieżki konwersji.Aby dodać dysk ramdisk dostawcy DLKM, ustaw
BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).KERNEL_MODULE_DIRS
na listę katalogów modułów jądra.Ustaw
BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).MKBOOTIMG_ARGS
namkbootimg
argumentów. Oto--board_id[0-15]
i--ramdisk_type
dla fragmentu Ramdysk dostawcy. W przypadku pamięci RAM DLKM dostawcy domyślna wartość--ramdisk_type
ma wartośćDLKM
, jeśli nie jest określona inaczej.
Aby utworzyć zasoby przywracania jako samodzielny dysk RAM recovery
w vendor_boot
:
- Ustaw
BOARD_BOOT_HEADER_VERSION
na4
. - Ustaw
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
natrue
. - Ustaw
BOARD_INCLUDE_RECOVERY_RAMDISK_IN_VENDOR_BOOT
natrue
. - Spowoduje to dodanie fragmentu pamięci RAM dostawcy, którego atrybut
ramdisk_name
ma wartośćrecovery
iramdisk_type
–VENDOR_RAMDISK_TYPE_RECOVERY
. Ramdysk zawiera wtedy wszystkich plików przywracania, czyli plików instalowanych na$(TARGET_RECOVERY_ROOT_OUT)
Argumenty mkbootimg
Argument | Opis |
---|---|
--ramdisk_type |
Typ dysku ramdy może być jednym z tych typów: NONE ,
PLATFORM , RECOVERY lub DLKM .
|
--board_id[0-15] |
Określ wektor board_id . Ustawienie domyślne to 0 . |
Oto przykładowa konfiguracja:
BOARD_KERNEL_MODULE_DIRS := foo bar baz
BOARD_BOOT_HEADER_VERSION := 4
BOARD_VENDOR_RAMDISK_FRAGMENTS := dlkm_foobar
BOARD_VENDOR_RAMDISK_FRAGMENT.dlkm_foobar.KERNEL_MODULE_DIRS := foo bar
BOARD_VENDOR_RAMDISK_FRAGMENT.dlkm_foobar.MKBOOTIMG_ARGS := --board_id0 0xF00BA5 --board_id1 0xC0FFEE
Wynik vendor_boot
będzie zawierać 2 fragmenty Ramdysków dostawcy.
Pierwszy jest „domyślny” ramdisk, który zawiera katalog DLKM baz
oraz
pozostałe pliki w folderze $(TARGET_VENDOR_RAMDISK_OUT)
. Drugi to
dlkm_foobar
ramdisk, który zawiera katalogi DLKM foo
i bar
oraz
--ramdisk_type
ma domyślną wartość DLKM
.