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

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

Пример процесса загрузки

Вот пример последовательности действий загрузчика:

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

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

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

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

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

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

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

    2. Загрузите образы виртуальной памяти (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 : from CONFIG_CMDLINE

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

Начиная с Android 12, для androidboot.* , которые необходимо передать в пользовательское пространство Android, вместо командной строки ядра можно использовать bootconfig .