Загрузчик — это образ, разработанный производителем и отвечающий за запуск ядра на устройстве. Загрузчик контролирует состояние устройства и отвечает за инициализацию доверенной среды выполнения (TEE) и связывание её корня доверия. Загрузчик также проверяет целостность boot и recovery разделов перед передачей выполнения ядру.
Пример потока загрузчика
Вот пример потока загрузчика:
- Загрузка и инициализация памяти. 
- Проверьте устройство в соответствии с процедурой проверенной загрузки . 
- Проверьте загрузочные разделы, включая - boot,- dtbo,- init_bootи- recovery, в соответствии с процедурой Verified Boot. В рамках этого шага проверьте версию заголовка загрузочного образа и проанализируйте его соответствующим образом.
- Если используются обновления A/B , определите текущий слот для загрузки. 
- Определите, следует ли загружать режим восстановления. Подробнее см. в разделе «Поддержка обновлений OTA» . 
- Загрузите загрузочные образы, такие как - boot.img,- vendor_boot.img,- init_boot.imgи другие загрузочные образы, разработанные поставщиками. Эти загрузочные образы содержат образы ядра и RAM-диска.- Загрузите ядро в память как самоисполняемый сжатый двоичный файл. Ядро распаковывается и начинает выполняться в памяти. 
- Загрузите ramdisks и раздел bootconfig в память для создания - initramfs.
 
Дополнительные функции, связанные с загрузчиком
Ниже приведен список дополнительных функций, связанных с загрузчиком, которые вы можете реализовать:
- Наложение дерева устройств (DTO). Наложение дерева устройств позволяет загрузчику поддерживать различные конфигурации оборудования. DTO компилируется в двоичный двоичный файл дерева устройств (DTB) , который используется загрузчиком. 
- Рандомизация виртуального адреса образа ядра. Загрузчик поддерживает рандомизацию виртуального адреса, по которому загружается образ ядра. Для рандомизации адреса установите - RANDOMIZE_BASEв- trueв конфигурации ядра. Загрузчик должен обеспечить энтропию, передавая случайное значение u64 в узле дерева устройств- /chosen/kaslr-seed.
- Проверенная загрузка. Проверенная загрузка позволяет загрузчику убедиться, что весь исполняемый код поступает из надёжного источника. 
- Конфигурация загрузки. Конфигурация загрузки доступна в Android 12 и более поздних версиях и представляет собой механизм передачи данных конфигурации из сборки и загрузчика в операционную систему. До Android 12 используются параметры командной строки ядра с префиксом - androidboot.
- Обновления по беспроводной сети (OTA). Устройства Android, находящиеся в эксплуатации, могут получать и устанавливать обновления OTA для системы, программного обеспечения приложений и правил часовых поясов. Эта функция влияет на реализацию загрузчика. Общую информацию об обновлениях OTA см. в разделе « Обновления OTA» . Подробности реализации OTA для конкретных загрузчиков см. в разделе «Поддержка обновлений OTA» . 
- Привязка версии . Привязка версии привязывает ключи безопасности к версии операционной системы и версии исправления. Привязка версии гарантирует, что злоумышленник, обнаружив уязвимость в старой версии системы или программном обеспечении TEE, не сможет откатить устройство к уязвимой версии и использовать ключи, созданные в новой версии. Загрузчик должен предоставить определённую информацию для поддержки привязки версии. Подробнее см. в разделе «Информация о версии в свойствах AVB» . 
Командная строка ядра
Объедините строку команды ядра из следующих мест:
- Командная строка загрузчика: набор статических и динамических параметров, определяемых загрузчиком 
- Дерево устройств: из узла - chosen/bootargs
- defconfig: из- CONFIG_CMDLINE
- boot.img: из командной строки (смещения и размеры см. в- system/core/mkbootimg/bootimg.h
 Начиная с Android 12, для параметров androidboot.* , которые необходимо передать в пользовательское пространство Android, мы можем использовать bootconfig вместо командной строки ядра.