Omówienie programu rozruchowego

Program rozruchowy to obraz należący do dostawcy, który odpowiada za uruchomienie jądra na urządzeniu. Program rozruchowy chroni stan urządzenia i jest odpowiedzialny za inicjowanie zaufanego środowiska wykonawczego (TEE) i powiązanie go z głównym źródłem zaufania. Program rozruchowy sprawdza też integralność partycji bootrecovery, zanim przekaże wykonanie do jądra.

Przykładowy przepływ programu rozruchowego

Oto przykładowy przepływ działania bootloadera:

  1. Wczytaj i zainicjuj pamięć.

  2. Zweryfikuj urządzenie zgodnie z procedurą weryfikacji rozruchu.

  3. Sprawdź partycje rozruchowe, w tym boot, dtbo, init_bootrecovery, zgodnie z procesem weryfikacji podczas uruchamiania. 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żący slot do uruchomienia.

  5. Określ, czy należy uruchomić tryb odzyskiwania. Więcej informacji znajdziesz w artykule 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 rozruchowe zawierają obrazy jądra i dysku RAM.

    1. Załaduj jądro do pamięci jako samowykonywalny skompresowany plik binarny. Jądro rozpakowuje się i zaczyna wykonywać w pamięci.

    2. Załaduj do pamięci dyski RAM i sekcję bootconfig, aby utworzyć initramfs.

Dodatkowe funkcje związane z programem rozruchowym

Poniżej znajdziesz listę dodatkowych funkcji związanych z programem rozruchowym, które możesz wdrożyć:

  • Nakładka drzewa urządzeń (DTO). Nakładka drzewa urządzeń umożliwia programowi rozruchowemu obsługę różnych konfiguracji sprzętowych. DTO jest kompilowany do pliku binarnego drzewa urządzenia (DTB), który jest używany przez program rozruchowy.

  • Losowe adresowanie wirtualne obrazu jądra. Program rozruchowy obsługuje losowe adresy wirtualne, pod którymi wczytywany jest obraz jądra. Aby losowo przypisać adres, ustaw w konfiguracji jądra wartość RANDOMIZE_BASE na true. Program rozruchowy musi dostarczać entropię, przekazując losową wartość u64 w /chosen/kaslr-seedwęźle drzewa urządzenia.

  • Weryfikacja podczas uruchamiania. Weryfikacja podczas uruchamiania umożliwia programowi rozruchowemu sprawdzenie, czy cały uruchomiony kod pochodzi z zaufanego źródła.

  • Konfiguracja rozruchu Konfiguracja uruchamiania jest dostępna w Androidzie 12 i nowszych wersjach. To mechanizm przekazywania szczegółów konfiguracji z kompilacji i programu rozruchowego do systemu operacyjnego. Przed Androidem 12 używane są parametry wiersza poleceń jądra z prefiksem androidboot.

  • Aktualizacje bezprzewodowe (OTA). Urządzenia z Androidem w terenie mogą otrzymywać i instalować aktualizacje OTA systemu, oprogramowania aplikacji i reguł stref czasowych. Ta funkcja ma wpływ na implementację programu ładującego. Ogólne informacje o OTA znajdziesz w artykule Aktualizacje OTA. Szczegółowe informacje o wdrażaniu aktualizacji OTA w przypadku programu rozruchowego znajdziesz w artykule Obsługa aktualizacji OTA.

  • Powiązanie wersji Powiązanie wersji wiąże klucze zabezpieczeń z systemem operacyjnym i wersją poziomu poprawek. Powiązanie wersji zapewnia, że atakujący, który odkryje słaby punkt w starszej wersji systemu lub oprogramowania TEE, nie będzie mógł przywrócić urządzenia do podatnej na ataki wersji i użyć kluczy utworzonych w nowszej wersji. Aby obsługiwać powiązanie wersji, program rozruchowy musi udostępniać określone informacje. Więcej informacji znajdziesz w artykule Informacje o wersji we właściwościach AVB.

Wiersz poleceń jądra

Połącz wiersz poleceń jądra z tych lokalizacji:

  • Wiersz poleceń programu rozruchowego: zestaw parametrów statycznych i dynamicznych określonych przez program rozruchowy.

  • Drzewo urządzeń: od węzła chosen/bootargs

  • defconfig: od CONFIG_CMDLINE

  • boot.img: z wiersza poleceń (w przypadku przesunięć i rozmiarów zapoznaj się z sekcją system/core/mkbootimg/bootimg.h

Od Androida 12 w przypadku parametrów androidboot.*, które musimy przekazywać do przestrzeni użytkownika Androida, możemy zamiast wiersza poleceń jądra używać bootconfig.