Начиная с 27 марта 2025 г. мы рекомендуем использовать android-latest-release
вместо aosp-main
для создания и участия в AOSP. Дополнительные сведения см. в разделе Изменения в AOSP .
Обзор загрузчика
Оптимизируйте свои подборки
Сохраняйте и классифицируйте контент в соответствии со своими настройками.
Загрузчик — это образ, принадлежащий поставщику и отвечающий за запуск ядра на устройстве. Загрузчик охраняет состояние устройства и отвечает за инициализацию Trusted Execution Environment (TEE) и связывание его корня доверия. Загрузчик также проверяет целостность разделов boot
и recovery
перед перемещением выполнения в ядро.
Пример потока загрузчика
Вот пример потока загрузчика:
Загрузите и инициализируйте память.
Проверьте устройство в соответствии с процедурой проверенной загрузки .
Проверьте разделы загрузки, включая boot
, dtbo
, init_boot
и recovery
, в соответствии с потоком Verified Boot. В рамках этого шага проверьте версию заголовка образа загрузки и проанализируйте заголовок соответствующим образом.
Если используются обновления A/B , определите текущий слот для загрузки.
Определите, следует ли загружать режим восстановления. Для получения дополнительной информации см. Поддержка обновлений OTA .
Загрузите загрузочные образы, такие как boot.img
, vendor_boot.img
, init_boot.img
и другие фирменные загрузочные образы поставщиков. Эти загрузочные образы содержат образы ядра и ramdisk.
Загрузить ядро в память как самоисполняемый сжатый двоичный файл. Ядро распаковывает себя и начинает выполняться в памяти.
Загрузите 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 вместо командной строки ядра.
Контент и образцы кода на этой странице предоставлены по лицензиям. Java и OpenJDK – это зарегистрированные товарные знаки корпорации Oracle и ее аффилированных лиц.
Последнее обновление: 2025-07-29 UTC.
[[["Прост для понимания","easyToUnderstand","thumb-up"],["Помог мне решить мою проблему","solvedMyProblem","thumb-up"],["Другое","otherUp","thumb-up"]],[["Отсутствует нужная мне информация","missingTheInformationINeed","thumb-down"],["Слишком сложен/слишком много шагов","tooComplicatedTooManySteps","thumb-down"],["Устарел","outOfDate","thumb-down"],["Проблема с переводом текста","translationIssue","thumb-down"],["Проблемы образцов/кода","samplesCodeIssue","thumb-down"],["Другое","otherDown","thumb-down"]],["Последнее обновление: 2025-07-29 UTC."],[],[],null,["# Bootloader overview\n\nA *bootloader* is a vendor-proprietary image responsible for bringing up the\nkernel on a device. The bootloader guards the device state and is responsible\nfor initializing the [Trusted Execution Environment (TEE)](/docs/security/features/trusty)\nand binding its root of trust. The bootloader also verifies the integrity of the\n`boot` and `recovery` partitions before moving execution to the kernel.\n\nExample bootloader flow\n-----------------------\n\nHere's an example bootloader flow:\n\n1. Load and initialize memory.\n\n2. Verify the device according to [Verified Boot flow](/docs/security/features/verifiedboot).\n\n3. Verify the boot partitions, including `boot`, `dtbo`, `init_boot`, and\n `recovery`, according to the Verified Boot flow. As part of this step, check the\n [boot image header](/docs/core/architecture/bootloader/boot-image-header)\n version and parse the header accordingly.\n\n4. If [A/B updates](/docs/core/ota/ab) are used, determine the current slot to\n boot.\n\n5. Determine if recovery mode should be booted. For more\n information, see\n [Supporting OTA Updates](/docs/core/architecture/bootloader/updating).\n\n6. Load the boot images, such as `boot.img`, `vendor_boot.img`,\n `init_boot.img`, and other proprietary vendor boot images. These boot images\n contain the kernel and ramdisk images.\n\n 1. Load the kernel into memory as a self-executable compressed\n binary. The kernel decompresses itself and starts executing into memory.\n\n 2. Load ramdisks and the bootconfig section into memory\n to create `initramfs`.\n\nAdditional bootloader-related features\n--------------------------------------\n\nFollowing is a list of additional bootloader-related features that you can\nimplement:\n\n- *Device tree overlay (DTO).*\n A [device tree overlay](/docs/core/architecture/dto) lets the bootloader to\n support different hardware configurations. A DTO is compiled into a *device\n tree blob (DTB)* which is used by the bootloader.\n\n- *Kernel image virtual address randomization.* The bootloader supports\n randomizing the virtual address at which the kernel image is loaded. To\n randomize the address, set `RANDOMIZE_BASE` to `true` in the kernel config.\n The bootloader must provide entropy by passing a random u64 value in the\n `/chosen/kaslr-seed` device tree node.\n\n- *Verified Boot.* [Verified Boot](/docs/security/features/verifiedboot) lets\n the bootloader to ensure all executed code comes from a trusted source.\n\n- *Boot config.*\n [Boot config](/docs/core/architecture/bootloader/implementing-bootconfig)\n is available in Android 12 and higher and is a mechanism for passing\n configuration details from the build and bootloader to the operating system.\n Prior to Android 12, kernel command-line parameters with the prefix of\n `androidboot` are used.\n\n- *Over-the-air (OTA) updates.* Android devices in the field can receive and\n install OTA updates to the system, app software, and\n time zone rules. This feature has implications on your bootloader\n implementation. For general information on OTA, see\n [OTA updates](/docs/core/ota). For bootloader-specific OTA implementation\n details, see\n [Supporting OTA updates](/docs/core/architecture/bootloader/updating).\n\n- *Version binding* .\n [Version binding](/docs/security/features/keystore/version-binding) binds\n security keys to the operating system and patch level version. Version binding\n ensures that an attacker who discovers a weakness in an old version of the\n system or the TEE software can't roll a device back to the vulnerable version\n and use keys created with the newer version. The bootloader must provide certain\n information to support version binding. For further information, see\n [Version information in AVB properties](/docs/core/architecture/bootloader/version-info-avb).\n\nKernel command line\n-------------------\n\nConcatenate the kernel command line from the following locations:\n\n- Bootloader command line: set of static and dynamic parameters determined by\n the bootloader\n\n- Device tree: from the `chosen/bootargs` node\n\n- `defconfig`: from `CONFIG_CMDLINE`\n\n- `boot.img`: from the command line (for offsets and sized, refer to\n [`system/core/mkbootimg/bootimg.h`](https://android.googlesource.com/platform/system/tools/mkbootimg/+/refs/heads/android16-release/include/bootimg/bootimg.h)\n\nAs of Android 12, for `androidboot.*` parameters that\nwe need to pass to Android userspace, we can use\n[bootconfig](/docs/core/architecture/bootloader/implementing-bootconfig) instead\nof the kernel command line."]]