Обзор

Загрузчик — это собственный образ поставщика, отвечающий за запуск ядра на устройстве. Он охраняет состояние устройства и отвечает за инициализацию Trusted Execution Environment и привязку его корня доверия. Загрузчик также проверяет целостность boot раздела и раздела recovery перед передачей выполнения в ядро ​​и отображает предупреждения о состоянии загрузки .

Загрузочные операции

Чтобы начать загрузку, загрузчик может напрямую прошить новый образ в соответствующий раздел или использовать recovery , чтобы запустить процесс перепрошивки, используемый для обновления по беспроводной сети (OTA). Некоторые производители устройств создают составные загрузчики, а затем объединяют их в один файл bootloader.img ; во время прошивки загрузчик извлекает и прошивает все отдельные загрузчики.

Пример потока загрузчика:

  1. Загрузчик загружается первым и инициализирует память.

  2. Если используются обновления A/B , загрузчик определяет текущий слот для загрузки.

  3. Загрузчик определяет, следует ли загружать режим восстановления (см. Поддержка обновлений ).

  4. Загрузчик загружает загрузочный образ, содержащий образы ядра и RAM-диска.

  5. Загрузчик загружает ядро ​​в память как самоисполняемый сжатый двоичный файл. Затем ядро ​​распаковывает себя и начинает выполнение в памяти.

  6. Загрузчик загружает init либо из раздела ramdisk (на старых устройствах), либо из системного раздела (на новых устройствах).

  7. Из системного раздела init запускает и монтирует все остальные разделы (например, vendor , oem и odm ), а затем запускает выполнение кода для запуска устройства.

Командная строка ядра

Объедините командную строку ядра из следующих мест:

  • Командная строка загрузчика: набор статических и динамических параметров, определяемых загрузчиком.

  • Дерево устройств: из узла selected/bootargs

  • defconfig : из CONFIG_CMDLINE

  • boot.img : из командной строки (смещения и размеры см. в system/core/mkbootimg/bootimg.h

  • Каноническая причина перезагрузки или завершения работы, соответствующая документу определения совместимости с Android , определенная на основе сообщений интегральной схемы управления питанием (PMIC), других аппаратных ресурсов и магических аргументов перезагрузки ( LINUX_REBOOT_CMD_RESTART2 ). Синтаксис:

    androidboot.bootreason=reason
    

Поддержка деревьев устройств и наложений деревьев устройств

Загрузчик может поддерживать различные конфигурации, определяя версию аппаратного обеспечения/продукта устройства, а затем загружая правильный набор оверлеев дерева устройств.

Поддержка рандомизации макета адресного пространства ядра.

Для поддержки рандомизации виртуального адреса, по которому загружается образ ядра (включено конфигурацией ядра RANDOMIZE_BASE ), загрузчик должен обеспечивать энтропию, передавая случайное значение u64 в узле дерева устройств /chosen/kaslr-seed .

Поддержка проверенной загрузки

Дополнительные сведения об использовании загрузчика для проверки загрузки см. в разделе Проверка загрузки .