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_boot
irecovery
, 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.img
i 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_BASE
natrue
. Program rozruchowy musi dostarczać entropię, przekazując losową wartość u64 w/chosen/kaslr-seed
węź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
: odCONFIG_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.