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 boot i recovery, zanim przekaże wykonanie do jądra.
Przykładowy przepływ programu rozruchowego
Oto przykładowy przepływ działania bootloadera:
- Wczytaj i zainicjuj pamięć. 
- Zweryfikuj urządzenie zgodnie z procedurą weryfikacji rozruchu. 
- Sprawdź partycje rozruchowe, w tym - boot,- dtbo,- init_booti- recovery, zgodnie z procesem weryfikacji podczas uruchamiania. 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żący slot do uruchomienia. 
- Określ, czy należy uruchomić tryb odzyskiwania. Więcej informacji znajdziesz w artykule Obsługa aktualizacji OTA. 
- Załaduj obrazy rozruchowe, takie jak - boot.img,- vendor_boot.img,- init_boot.imgi inne zastrzeżone obrazy rozruchowe dostawców. Te obrazy rozruchowe zawierają obrazy jądra i dysku RAM.- Załaduj jądro do pamięci jako samowykonywalny skompresowany plik binarny. Jądro rozpakowuje się i zaczyna wykonywać w pamięci. 
- 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_BASEna- 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.
