Загрузчик — это собственный образ поставщика, отвечающий за запуск ядра на устройстве. Загрузчик охраняет состояние устройства и отвечает за инициализацию доверенной среды выполнения (TEE) и привязку ее корня доверия. Загрузчик также проверяет целостность разделов boot
и recovery
перед передачей выполнения ядру.
Пример потока загрузчика
Вот пример потока загрузчика:
Загрузите и инициализируйте память.
Проверьте устройство в соответствии с процедурой проверенной загрузки .
Проверьте загрузочные разделы, включая
boot
,dtbo
,init_boot
иrecovery
, в соответствии с потоком проверенной загрузки. В рамках этого шага проверьте версию заголовка загрузочного образа и соответствующим образом проанализируйте заголовок.Если используются обновления A/B , определите текущий слот для загрузки.
Определите, следует ли загружать режим восстановления. Дополнительную информацию см. в разделе «Поддержка OTA-обновлений» .
Загрузите загрузочные образы, такие как
boot.img
,vendor_boot.img
,init_boot.img
и другие проприетарные загрузочные образы поставщиков. Эти загрузочные образы содержат образы ядра и виртуального диска.Загрузите ядро в память как самоисполняемый сжатый двоичный файл. Ядро распаковывает себя и начинает выполнение в памяти.
Загрузите виртуальные диски и раздел 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 вместо командной строки ядра.