Загрузчик — это собственный образ поставщика, отвечающий за запуск ядра на устройстве. Он охраняет состояние устройства и отвечает за инициализацию Trusted Execution Environment и привязку его корня доверия. Загрузчик также проверяет целостность boot
раздела и раздела recovery
перед передачей выполнения в ядро и отображает предупреждения о состоянии загрузки .
Загрузочные операции
Чтобы начать загрузку, загрузчик может напрямую прошить новый образ в соответствующий раздел или использовать recovery
, чтобы запустить процесс перепрошивки, используемый для обновления по беспроводной сети (OTA). Некоторые производители устройств создают составные загрузчики, а затем объединяют их в один файл bootloader.img
; во время прошивки загрузчик извлекает и прошивает все отдельные загрузчики.
Пример потока загрузчика:
Загрузчик загружается первым и инициализирует память.
Если используются обновления A/B , загрузчик определяет текущий слот для загрузки.
Загрузчик определяет, следует ли загружать режим восстановления (см. Поддержка обновлений ).
Загрузчик загружает загрузочный образ, содержащий образы ядра и RAM-диска.
Загрузчик загружает ядро в память как самоисполняемый сжатый двоичный файл. Затем ядро распаковывает себя и начинает выполнение в памяти.
Загрузчик загружает
init
либо из разделаramdisk
(на старых устройствах), либо из системного раздела (на новых устройствах).Из системного раздела
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
.
Поддержка проверенной загрузки
Дополнительные сведения об использовании загрузчика для проверки загрузки см. в разделе Проверка загрузки .