Na tej stronie dowiesz się, jak wdrożyć plik binarny ogólnego programu rozruchowego (GBL).
Wymagania dotyczące oprogramowania rozruchowego
Aby można było używać GBL, oprogramowanie rozruchowe musi spełniać te wymagania:
Zgodność z Unified Extensible Firmware Interface (UEFI). Oprogramowanie musi implementować i używać wymaganych protokołów UEFI. Musi też umożliwiać korzystanie z rozszerzeń specyficznych dla dostawcy za pomocą zdefiniowanych protokołów UEFI.
Zabezpieczenia. Oprogramowanie musi implementować wszystkie wymagania dotyczące weryfikacji podczas uruchamiania na Androidzie (AVB), co umożliwi GBL uwierzytelnianie obrazów rozruchowych.
Tryby uruchamiania. Plik binarny powinien obsługiwać różne tryby uruchamiania, takie jak normalne uruchamianie, uruchamianie w trybie odzyskiwania i fastboot.
Partycjonowanie dynamiczne. Oprogramowanie rozruchowe musi implementować logikę wyboru slotu, aby obsługiwać odczytywanie prawidłowego slotu rozruchowego A/B i być zgodne z partycjami dynamicznymi oraz danymi użytkownika w super.
Konfiguracja systemu operacyjnego. Oprogramowanie musi mieć możliwość modyfikowania wiersza poleceń jądra, drzewa urządzeń (DTB) i bootconfig za pomocą dostosowań OEM wymaganych do uruchomienia urządzenia.
Wczytywanie chronionej maszyny wirtualnej. Plik binarny powinien prawidłowo wczytywać wstępnie zweryfikowane oprogramowanie chronionej maszyny wirtualnej przed jądrem Androida w przypadku obecności chronionych maszyn wirtualnych. Więcej informacji znajdziesz w artykule Sekwencja uruchamiania Microdroida.
Zarządzanie pamięcią. Oprogramowanie rozruchowe musi obsługiwać interfejs API alokacji pamięci UEFI.
Wymagania związane z implementacją
Aby GBL zostało prawidłowo zaimplementowane na urządzeniu, musisz spełnić te wymagania:
Urządzenie musi zawierać 2 partycje FAT o rozmiarze 8 MB (lub większym) o nazwach
android_esp_aiandroid_esp_bna urządzeniu blokowym dostępnym dla SOC.- Urządzenie blokowe to urządzenie pamięci masowej, z którego można odczytywać i na którym można zapisywać dane w jednostkach bloków. Przykłady to urządzenia UFS, eMMC i karty SD.
- Używamy systemu FAT, ponieważ jest to powszechny i prosty system plików.
- Zalecamy wybranie systemu plików FAT odpowiedniego do Twoich potrzeb spośród FAT12, FAT16 i FAT32.
- Obie partycje są wymagane do aktualizacji bezprzewodowych (OTA) i wycofywania zmian przez cały okres obsługi tej wersji Androida.
- GBL ma po rozpakowaniu około 2 MB. 8 MB wystarczy, aby uwzględnić wzrost rozmiaru spowodowany dodaniem funkcji w ciągu najbliższych 7 lat.
- W przypadku aktualizacji GBL musisz zaktualizować całą partycję
android_esp_${SLOT_SUFFIX}. Aktualizacja tylko GBL nie jest obsługiwana przez Android OTA. - Identyfikator GUID typu partycji używany w przypadku obu partycji FAT musi odpowiadać identyfikatorowi GUID partycji systemowej EFI
C12A7328-F81F-11D2-BA4B-00A0C93EC93B.
Wdrożona wersja GBL musi być najnowszą certyfikowaną kompilacją produkcyjną z odpowiedniej gałęzi wydania GBL. Zalecamy podpisanie certyfikowanej przez Google kopii GBL za pomocą preferowanego rozwiązania do podpisywania i przechowywanie wynikowej kompilacji oraz metadanych podpisu w partycji
android_esp_${SLOT_SUFFIX}.- Certyfikat GBL MUSI pozostać nienaruszony przez podpis OEM, a do pliku binarnego nie można stosować nagłówka.
- Kompilacja GBL dla deweloperów jest używana wyłącznie do celów programistycznych i debugowania. Nie można jej dostarczyć i nie będzie certyfikowana przez Google.
GBL musi być przechowywany w ścieżce
/EFI/BOOT/BOOTAA64.EFIw partycji FAT.Aby obsługiwać GBL, zaimplementuj wymagane protokoły UEFI i Android UEFI. Jeśli te interfejsy nie są obsługiwane, kompilacja produkcyjna GBL nie uruchomi się.
EFI_BLOCK_IO_PROTOCOLlubEFI_BLOCK_IO2_PROTOCOLpobiera obrazy rozruchowe i obrazy pvmfw z dysku.EFI_RNG_PROTOCOLw przypadku kanarków stosu, ziarna KASLR i ziarna RNG.- Usługi alokacji pamięci do alokacji pamięci roboczej na potrzeby obliczeń AVB i DICE.
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOLzapewnia opcję implementacji bez operacji, ale GBL domyślnie loguje się za pomocą tego protokołu.GBL_EFI_AVB_PROTOCOLuzyskuje dostęp do kluczy publicznych i indeksów wycofywania, aby zweryfikować obrazy rozruchowe.GBL_EFI_BOOT_CONTROL_PROTOCOLpobiera metadane slotu i przyczyny uruchomienia z oprogramowania.GBL_EFI_AVF_PROTOCOLgeneruje dane konfiguracyjne AVF z łańcucha DICE.
Oprogramowanie musi udostępniać GBL zmienne UEFI. Te zmienne muszą być ustawione na wartość
GBL_EFI_VENDOR_GUIDrówną5a6d92f3-a2d0-4083-91a1-a50f6c3d9830.gbl_fw_api_levelmusi być ustawiony na poziom interfejsu API oprogramowania platformy, co wskazuje poziom interfejsu API oprogramowania dostawcy. Ta zmienna musi mieć taką samą wartość jak właściwość systemuro.board.api_level.
Protokoły UEFI, które są zdecydowanie zalecane podczas integrowania GBL, są opisane w artykule Protokoły GBL UEFI.
Obsługa oprogramowania rozruchowego
Po wprowadzeniu zmian niezbędnych do obsługi wymagań z poprzedniej sekcji te implementacje oprogramowania UEFI działają z GBL:
- EDK2 (Tianocore). EDK2 to popularna implementacja UEFI typu open source. W przypadku programów rozruchowych opartych na EDK2 wymagana jest obsługa GBL, a obsługa UEFI jest już dostępna.
- U-Boot. Elastyczny i powszechnie używany projekt programu rozruchowego typu open source, który zyskuje zgodność z UEFI na potrzeby używania GBL.
- LittleKernel (LK). Program rozruchowy typu open source używany przez niektórych dostawców.
Uruchamianie GBL
Możesz pobrać wstępnie skompilowany plik binarny GBL, aby go uruchomić, lub skompilować własny i go uruchomić.
Pobieranie i uruchamianie pliku binarnego GBL
GBL jest rozpowszechniany jako pojedynczy plik binarny aplikacji UEFI. Możesz zaktualizować ten plik binarny niezależnie od podstawowego oprogramowania urządzenia za pomocą standardowego mechanizmu aktualizacji Androida.
Jeśli od Androida 16 wysyłasz urządzenie oparte na chipsecie ARM-64, zdecydowanie zalecamy wdrożenie najnowszej certyfikowanej przez Google wersji GBL i zintegrowanie jej z łańcuchem uruchamiania.
Aby debugować tę kompilację GBL, możesz pobrać dowolny z tych artefaktów, które pomogą w debugowaniu:
- Tabela symboli używa debugera sprzętowego i GDB w przypadku kompilacji GBL certyfikowanej przez Google.
- Manifest wprowadza zmiany w podpisanej kompilacji, odtwarzając
tę kompilację GBL ze źródła za pomocą
repo. - Odpowiednia kompilacja GBL dla deweloperów jest przydatna w przypadku uruchamiania lub mniej zaawansowanego debugowania problemu wpływającego na podpisaną kompilację produkcyjną.
- Tabela symboli jest przydatna w przypadku kompilacji GBL dla deweloperów z debugerem sprzętowym i GDB.
Kompilowanie GBL
Aby skompilować GBL:
Sprawdź, czy masz zainstalowane narzędzie
repoi bootstrap Bazela:sudo apt install repo bazel-bootstrapZainicjuj bieżący katalog na potrzeby kontroli źródła za pomocą pliku manifestu
uefi-gbl-mainline:repo init -u https://android.googlesource.com/kernel/manifest -b uefi-gbl-mainline repo sync -j16Skompiluj aplikację UEFI:
tools/bazel run //bootable/libbootloader:gbl_efi_dist
Testowanie GBL na urządzeniu wirtualnym z Androidem
Uruchom GBL w Cuttlefish:
cvd start --android_efi_loader=path_to_the_UEFI_app ...Zamiast bezpośrednio uruchamiać Androida, to polecenie
cvd startużywa aplikacji UEFI do uruchamiania Androida.
Zgłaszanie błędów i kontaktowanie się z zespołem ds. programu rozruchowego
Aby zgłosić błąd dotyczący GBL, otwórz komponent ogólnego programu rozruchowego Androida w Buganizerze.
Jeśli masz pytania, skontaktuj się z zespołem GBL, wysyłając e-maila na adres android-gbl@google.com.