Wdrażanie konfiguracji rozruchowej w Androidzie 12

W Androidzie 12 funkcja rozruchu zastępuje Opcje polecenia cmdline jądra systemu androidboot.* używane w Androidzie 11 lub niższy. Funkcja rozruchu konfiguracji to mechanizm przekazywania konfiguracji z kompilacji i programu rozruchowego aż po Androida 12.

Ta funkcja umożliwia rozdzielenie parametrów konfiguracji w przypadku Androida. i przestrzeń użytkownika dla jądra systemu operacyjnego. Przenoszenie długiego jądra systemu androidboot.* tworzy miejsce w wierszu cmdline jądra i sprawia, można ją wykorzystać w przyszłości.

Jądro i przestrzeń użytkownika Androida muszą obsługiwać bootconfig.

  • Pierwsza wersja obsługująca tę funkcję: Android 12
  • Pierwsza wersja jądra obsługująca tę obsługę: jądro 12-5.4.xx

Wdróż funkcję rozruchu na nowych urządzeniach z wersjami 12–5.10.xx wersji jądra systemu operacyjnego. Nie musisz jej wdrażać, jeśli uaktualniasz urządzenia.

Przykłady i źródło

Analizując przykłady i kod źródłowy w tej sekcji, zwróć uwagę na format kodu bootconfig różni się tylko nieznacznie od formatu Instrukcja cmdline jądra używana w Androidzie 11 i starszych wersjach. Jednak z uwagi na sposób korzystania z urządzenia musisz zwrócić uwagę na tę różnicę:

  • Parametry muszą być rozdzielone znakami nowego wiersza \n, a nie znakami spacje.

Przykład programu rozruchowego

Przykładowy program rozruchowy Cuttlefish znajdziesz w referencyjnym programie rozruchowym Cuttlefish U-boot. implementacji. Poniżej znajdziesz 2 zatwierdzenia w dokumentacji. Pierwsze wzrosty obsługę najnowszej wersji nagłówka rozruchowego. W tym przykładzie pierwszy element zatwierdzenia aktualizacji (lub przyspieszenia) obsługi kolejnych wersji (v4). Druga ma dwie rzeczy: dodaje obsługę konfiguracji rozruchowej i pokazuje dodawanie parametrów w czasie działania:

Przykładowa kompilacja

W przypadku przykładowej kompilacji, w której widać zmiany w elemencie mkbootimg, aby utworzyć vendor_boot.img z nagłówkiem rozruchowym dostawcy w wersji 4: patrz mkbootimg changes for bootconfig. Zobacz zmiany w mątwie:

Implementacja

Partnerzy muszą dodać obsługę do swoich programów rozruchowych i skrócić czas kompilacji Parametry androidboot.* z wiersza poleceń jądra do konfiguracji rozruchowej . Najlepszym sposobem na wprowadzenie tej zmiany jest stopniowe wprowadzanie tych zmian. zobacz Sekcja Implementacja i weryfikacja przyrostowa .

Jeśli masz zmiany, które powodują wyszukiwanie androidboot.* w pliku /proc/cmdline wskaż plik /proc/bootconfig. ro.boot.* właściwości są ustawione z nowymi wartościami bootconfig, nie musisz więc zmian w kodzie za pomocą tych właściwości.

Wprowadź zmiany

Najpierw zwiększ wersję nagłówka rozruchowego do wersji 4:

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

Dodaj parametr cmdline jądra bootconfig. Sprawia, że jądro szuka w sekcji dotyczącej rozruchu:

BOARD_KERNEL_CMDLINE += bootconfig

Parametry w konfiguracji rozruchowej są tworzone na podstawie parametrów w pliku Zmienna BOARD_BOOTCONFIG, podobnie jak cmdline jądra tworzonego BOARD\_KERNEL\_CMDLINE

Wszystkie parametry androidboot.* można przenieść w niezmienionej postaci, podobnie jak tutaj:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

Zmiany programu rozruchowego

Program rozruchowy konfiguruje initramfs przed przejściem do jądra. Jądro konfiguracja uruchamiania wyszukuje sekcję rozruchu i wyszukuje ją na samym końcu initramfs, z oczekiwanym zwiastunem.

Program rozruchowy pobiera od dostawcy informacje o układzie vendor_boot.img nagłówek obrazu rozruchowego.

Schemat układu alokacji pamięci w konfiguracji rozruchowej

Rysunek 1. Alokacja pamięci w konfiguracji rozruchowej Androida 12

Program rozruchowy tworzy sekcję rozruchu w pamięci. Sekcja konfiguracji rozruchu zawiera alokacje pamięci dla tych elementów:

  • Parametry
  • 4 B Rozmiar parameters size
  • 4 B Rozmiar parameters checksum
  • Magiczny ciąg znaków konfiguracji rozruchu 12 B (#BOOTCONFIG\n)

Parametry pochodzą z 2 źródeł: parametrów znanych w momencie kompilacji oraz Parametry, które są nieznane w momencie kompilacji. Trzeba dodać nieznane parametry.

Parametry znane w czasie kompilacji są spakowane na końcu vendor_boot w sekcji konfiguracji rozruchowej. Zapisywany rozmiar sekcji (w bajtach) w polu nagłówka rozruchu dostawcy vendor_bootconfig_size.

Parametry, które nie są znane w czasie kompilacji, są znane tylko w czasie działania programu rozruchowego. Należy je dodać na końcu sekcji parametrów rozruchu przed zastosowaniem zwiastuna rozruchowego.

Jeśli po zastosowaniu zwiastuna rozruchowego musisz dodać jakieś parametry, zastąp zwiastun i zastosuj go ponownie.

Implementacja i weryfikacja przyrostowa

Stopniowo wdrażaj funkcję rozruchu, postępując zgodnie z instrukcjami podanymi w w tej sekcji. Pozostaw parametry wiersza poleceń jądra bez zmian, podczas gdy zostaną dodane parametry programu rozruchowego.

Oto kroki implementacji przyrostowej z weryfikacją:

  1. Wprowadź zmiany w programie rozruchowym i kompilacji, a potem wykonaj te czynności:
    1. Dodaj nową konfigurację rozruchową przy użyciu zmiennej BOARD_BOOTCONFIG .
    2. Zachowaj parametry cmdline jądra bez zmian, aby urządzenie mogą nadal poprawnie się uruchamiać. Debugowanie i weryfikacja
  2. Zweryfikuj swoją pracę, sprawdzając zawartość dokumentu /proc/bootconfig. Zweryfikuj zobaczysz nowo dodany parametr po uruchomieniu urządzenia.
  3. Przenieś parametry androidboot.* z wiersza poleceń jądra do przy użyciu zmiennej BOARD_BOOTCONFIG i programu rozruchowego.
  4. Sprawdź, czy każdy z parametrów występuje w parametrze /proc/bootconfig ORAZ czy nie są w /proc/cmdline. Jeśli możesz to sprawdzić, implementacja udało się.

Uwagi na temat uaktualniania OTA i przechodzenia na niższą wersję

Gdy zarządzasz uaktualnieniami OTA różnych wersji Zachowaj szczególną ostrożność, gdy korzystasz z Androida i innych wersji jądra.

Android 12 to pierwsza wersja z rozruchem konfiguracyjnym . W przypadku zmiany wersji na dowolną wcześniejszą wersję parametry wiersza poleceń jądra zamiast pliku rozruchowego.

Jądro w wersjach 12–5.4 i nowszych obsługuje konfigurację rozruchu. W przypadku przejścia na niższą wersję do dowolnej wcześniejszej wersji(w tym 11-5.4), parametry wiersza poleceń jądra muszą być .

Po przejściu z Androida 11 lub starszego na Androida 12 lub nowszego możesz nadal korzystać z parametrami wiersza poleceń jądra. To samo dotyczy uaktualniania wersji jądra.

Rozwiązywanie problemów

Jeśli po wykonaniu kroku weryfikacji nie widzisz oczekiwanych parametrów w /proc/bootconfig sprawdź logi jądra w logcat. Zawsze znajdziesz dziennik wpis dla konfiguracji rozruchowej, jeśli ją obsługuje.

Przykładowe dane wyjściowe logu

$ adb logcat | grep bootconfig
02-24 17:00:07.610     0     0 I Load bootconfig: 128 bytes 9 nodes

Jeśli wyświetli się dziennik błędów, oznacza to, że podczas wczytywania konfiguracji rozruchowej. Aby wyświetlić różne typy błędów, wyświetl init/main.c