Обзор загрузчика

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

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

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

  1. Загрузите и инициализируйте память.

  2. Проверьте устройство в соответствии с процедурой проверенной загрузки .

  3. Проверьте разделы загрузки, включая boot , dtbo , init_boot и recovery , в соответствии с потоком Verified Boot. В рамках этого шага проверьте версию заголовка образа загрузки и проанализируйте заголовок соответствующим образом.

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

  5. Определите, следует ли загружать режим восстановления. Для получения дополнительной информации см. Поддержка обновлений OTA .

  6. Загрузите загрузочные образы, такие как boot.img , vendor_boot.img , init_boot.img и другие фирменные загрузочные образы поставщиков. Эти загрузочные образы содержат образы ядра и ramdisk.

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

    2. Загрузите ramdisks и раздел bootconfig в память для создания initramfs .

Дополнительные функции, связанные с загрузчиком

Ниже приведен список дополнительных функций, связанных с загрузчиком, которые вы можете реализовать:

  • Наложение дерева устройств (DTO). Наложение дерева устройств позволяет загрузчику поддерживать различные конфигурации оборудования. DTO компилируется в двоичный двоичный файл дерева устройств (DTB) , который используется загрузчиком.

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

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

  • Boot config. Boot config доступен в 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 вместо командной строки ядра.