Przegląd programu ładującego

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:

  1. Załaduj i zainicjuj pamięć.

  2. Sprawdź urządzenie zgodnie z procedurą Verified Boot .

  3. Sprawdź partycje rozruchowe, w tym boot , dtbo , init_boot i recovery , zgodnie z przepływem zweryfikowanego rozruchu. W ramach tego kroku sprawdź wersję nagłówka obrazu rozruchowego i odpowiednio przeanalizuj nagłówek.

  4. Jeśli używane są aktualizacje A/B , określ bieżące gniazdo do uruchomienia.

  5. Określ, czy należy uruchomić tryb odzyskiwania. Aby uzyskać więcej informacji, zobacz Obsługa aktualizacji OTA .

  6. 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.

    1. Załaduj jądro do pamięci jako samowykonywalny, skompresowany plik binarny. Jądro dekompresuje się i rozpoczyna wykonywanie w pamięci.

    2. 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 na true 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 : z CONFIG_CMDLINE

  • boot.img : z wiersza poleceń (przesunięcia i rozmiar można znaleźć w system/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.