Program ładujący to zastrzeżony przez dostawcę obraz odpowiedzialny za uruchomienie jądra na urządzeniu. Program ładujący chroni stan urządzenia i jest odpowiedzialny za inicjowanie zaufanego środowiska wykonawczego (TEE) i powiązanie jego katalogu głównego zaufania. Program ładujący weryfikuje także integralność partycji boot
i recovery
przed przeniesieniem wykonania do jądra.
Przykładowy przepływ bootloadera
Oto przykładowy przepływ bootloadera:
Załaduj i zainicjuj pamięć.
Sprawdź urządzenie zgodnie z procedurą Verified Boot .
Sprawdź partycje rozruchowe, w tym
boot
,dtbo
,init_boot
irecovery
, zgodnie z przepływem zweryfikowanego rozruchu. W ramach tego kroku sprawdź wersję nagłówka obrazu rozruchowego i odpowiednio przeanalizuj nagłówek.Jeśli używane są aktualizacje A/B , określ bieżące gniazdo do uruchomienia.
Określ, czy należy uruchomić tryb odzyskiwania. Aby uzyskać więcej informacji, zobacz Obsługa aktualizacji OTA .
Załaduj obrazy rozruchowe, takie jak
boot.img
,vendor_boot.img
,init_boot.img
i inne zastrzeżone obrazy rozruchowe dostawców. Te obrazy startowe zawierają obrazy jądra i ramdysku.Załaduj jądro do pamięci jako samowykonywalny, skompresowany plik binarny. Jądro dekompresuje się i rozpoczyna wykonywanie w pamięci.
Załaduj ramdyski i sekcję bootconfig do pamięci, aby utworzyć
initramfs
.
Dodatkowe funkcje związane z bootloaderem
Poniżej znajduje się lista dodatkowych funkcji związanych z bootloaderem, które możesz zaimplementować:
Nakładka drzewa urządzeń (DTO). Nakładka drzewa urządzeń umożliwia bootloaderowi obsługę różnych konfiguracji sprzętowych. DTO jest kompilowane do obiektu blob drzewa urządzeń (DTB), który jest używany przez program ładujący.
Randomizacja adresu wirtualnego obrazu jądra. Program ładujący obsługuje losowanie adresu wirtualnego, pod którym ładowany jest obraz jądra. Aby losowo ustawić adres, ustaw
RANDOMIZE_BASE
natrue
w konfiguracji jądra. Program ładujący musi zapewnić entropię, przekazując losową wartość u64 w węźle drzewa urządzeń/chosen/kaslr-seed
.Zweryfikowany rozruch. Verified Boot pozwala programowi ładującemu upewnić się, że cały wykonywany kod pochodzi z zaufanego źródła.
Konfiguracja rozruchu. Konfiguracja rozruchu jest dostępna w systemie Android 12 i nowszych wersjach i stanowi mechanizm przekazywania szczegółów konfiguracji z kompilacji i programu ładującego do systemu operacyjnego. Przed wersją Androida 12 używane są parametry wiersza poleceń jądra z przedrostkiem
androidboot
.Aktualizacje bezprzewodowe (OTA). Urządzenia z Androidem w terenie mogą odbierać i instalować aktualizacje OTA systemu, oprogramowania aplikacji i reguł stref czasowych. Ta funkcja ma wpływ na implementację programu ładującego. Ogólne informacje na temat OTA znajdziesz w Aktualizacje OTA . Aby uzyskać szczegółowe informacje na temat implementacji OTA specyficznej dla bootloadera, zobacz Obsługa aktualizacji OTA .
Wersja wiążąca . Powiązanie wersji wiąże klucze bezpieczeństwa z wersją systemu operacyjnego i poziomu poprawki. Powiązanie wersji gwarantuje, że osoba atakująca, która odkryje słabość w starej wersji systemu lub oprogramowania TEE, nie będzie mogła przywrócić urządzenia do wersji podatnej na ataki i użyć kluczy utworzonych w nowszej wersji. Program ładujący musi dostarczyć pewnych informacji, aby obsługiwał powiązanie wersji. Aby uzyskać więcej informacji, zobacz Informacje o wersji we właściwościach AVB .
Wiersz poleceń jądra
Połącz wiersz poleceń jądra z następujących lokalizacji:
Linia poleceń programu ładującego: zestaw parametrów statycznych i dynamicznych określonych przez program ładujący
Drzewo urządzeń: z
chosen/bootargs
defconfig
: zCONFIG_CMDLINE
boot.img
: z wiersza poleceń (przesunięcia i rozmiar można znaleźć wsystem/core/mkbootimg/bootimg.h
Począwszy od Androida 12, w przypadku parametrów androidboot.*
, które musimy przekazać do przestrzeni użytkownika Androida, możemy użyć bootconfig zamiast wiersza poleceń jądra.