Google стремится продвигать расовую справедливость для черных сообществ. Смотри как.
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

Разделы и изображения

Перегородки

Устройства Android содержат несколько разделов, которые выполняют различные функции в процессе загрузки. Для поддержки обновлений A / B устройству потребуется один слот на раздел для boot , system , vendor и radio .

  • boot : boot раздел содержит образ ядра и RAM-диск, объединенные через mkbootimg . Чтобы напрямую перепрограммировать ядро, не перезагружая новый загрузочный раздел, можно использовать виртуальный раздел:
    • Ядро : виртуальный раздел kernel перезаписывает только ядро ​​(zImage, zImage-dtb, Image.gz-dtb), записывая новый образ поверх старого. Для этого он определяет начальное местоположение существующего образа ядра в eMMC и копирует в это местоположение, учитывая, что новый образ ядра может быть больше существующего. Загрузчик может освободить место, перемещая любые данные после него или отказываясь от операции с ошибкой. Если предоставленное ядро ​​разработки несовместимо, вам может потребоваться обновить раздел dtb, если он есть, или раздел поставщика или системы с помощью связанных модулей ядра.
    • ramdisk : виртуальный раздел ramdisk перезаписывает только RAM-диск, записывая новый образ поверх старого. Для этого он определяет начальное местоположение существующего ramdisk.img в eMMC и копирует в это место, помня, что новый RAM-диск может быть больше существующего. Загрузчик может либо освободить место, перемещая любые данные после него, либо отказаться от операции с ошибкой.
  • system : system раздел в основном содержит платформу Android.
  • recovery : раздел recovery хранит образ восстановления, загруженный во время процесса OTA. Если устройство поддерживает обновления A / B , восстановление может представлять собой RAM-диск, содержащийся в загрузочном образе, а не отдельный образ.
  • кеш : раздел cache хранит временные данные и является необязательным, если устройство использует обновления A / B. Раздел кэша не должен быть доступен для записи из загрузчика, только стираемый. Размер зависит от типа устройства и наличия места на пользовательских данных. В настоящее время 50 МБ-100 МБ должно быть в порядке.
  • misc : раздел misc используется для восстановления и имеет размер 4 КБ или более.
  • userdata : раздел userdata содержит установленные пользователем приложения и данные, включая данные настройки.
  • метаданные : раздел metadata используется, когда устройство зашифровано и имеет размер 16 МБ или более.
  • vendor : В разделе vendor содержится любой двоичный файл, который нельзя распространять в Android Open Source Project (AOSP). Если конфиденциальная информация отсутствует, этот раздел может быть пропущен.
  • радио : раздел radio содержит радиоизображение. Этот раздел необходим только для устройств, которые включают в себя радиоприемник с программным обеспечением для радиосвязи в выделенном разделе.
  • tos : раздел tos хранит двоичный образ ОС Trusty и используется только в том случае, если устройство включает в себя Trusty.

поток

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

  1. Загрузчик загружается первым.
  2. Загрузчик инициализирует память.
  3. Если используются обновления A / B , определите текущий слот для загрузки.
  4. Определите, должен ли загружаться режим восстановления, как описано в разделе «Поддержка обновлений» .
  5. Загрузчик загружает образ, который содержит ядро ​​и RAM-диск (а в Treble даже больше).
  6. Загрузчик начинает загрузку ядра в память в виде самоисполняемого сжатого двоичного файла.
  7. Ядро распаковывается и начинает работать в памяти.
  8. С этого момента старые устройства загружают init с диска RAM, а новые устройства загружают его из раздела /system .
  9. Из /system init запускает и запускает монтирование всех других разделов, таких как /vendor , /oem и /odm , а затем начинает выполнение кода для запуска устройства

Изображений

Загрузчик опирается на эти образы.

Образы ядра

Образы ядра создаются в стандартном формате Linux, например, zImage, Image или Image.gz. Образы ядра могут быть прошиты независимо друг от друга, объединены с образами дисков ОЗУ и перенесены в загрузочный раздел или загружены из памяти. При создании образов ядра рекомендуется использовать сцепленные двоичные файлы дерева устройств, используя отдельный раздел для дерева устройств. При использовании нескольких BLOB-объектов дерева устройств (DTB) для разных версий плат объедините несколько DTB в порядке убывания версий плат.

Образы RAM-дисков

RAM-диски должны содержать корневую файловую систему, подходящую для монтирования в качестве rootfs. Образы RAM-дисков объединяются с образами ядра с помощью mkbootfs, а затем записываются в загрузочный раздел.

Загрузочные образы

Загрузочные образы должны содержать ядро ​​и RAM-диск, объединенные с использованием неизмененного mkbootimg .

Реализацию mkbootimg можно найти по адресу: system/core/mkbootimg

Загрузчик считывает bootimg.h заголовка bootimg.h сгенерированный mkbootimg, и обновляет заголовок ядра, чтобы он содержал правильное местоположение и размер RAM-диска во флэш-памяти, базовый адрес ядра, параметры командной строки и многое другое. Затем загрузчик добавляет командную строку, указанную в образе загрузки, в конец командной строки, сгенерированной загрузчиком.

Образы файловой системы (system, userdata, recovery)

Формат изображения YAFFS2

Если используется сырое хранилище NAND, эти образы должны быть YAFFS2, сгенерированными неизмененным mkyaffs2image, как это найдено в Android Open Source Project (AOSP) по адресу external/yaffs2/yaffs2/utils . У них есть формат:


| 2k bytes of data| yaffs extra data | padding | | 0  2048 | 0 64 | variable|

Загрузчик отвечает за использование этих образов и перемещение дополнительных данных yaffs в соответствующее место во внеполосной области для данного оборудования nand. Если требуется программное ECC, загрузчик также должен выполнить это вычисление в это время.

Разреженный формат изображения

Разреженный формат изображения должен поддерживаться. Это описано в документе "ext4 сжатые изображения" и в system/core/libsparse/sparse_format.h ; это реализовано в: system/core/libsparse/sparse_read.cpp

При использовании блочного запоминающего устройства должны поддерживаться ext4 или f2fs. Для быстрой передачи и прошивки больших, пустых файловых систем ext4 (userdata) сохраните изображение в разреженном формате, который содержит информацию о том, какие области файловой системы можно оставить неписанными. Формат файла записывается утилитой mke2fs которая также используется для создания изображений, формат файла считывается и мигает загрузчиком. Смотрите разделы ниже для атрибутов:

Формат файла
  • Все поля без знака
  • Файл содержит заголовок файла, за которым следует последовательность фрагментов
  • Заголовок файла, заголовок куска и данные куска имеют кратные 4 байта
  • 32-битная магия: 0xed26ff3a
  • 16-битная основная версия (0x1) - отклонять изображения с более старшими основными версиями
  • 16-битная минорная версия (0x0) - разрешить изображения с более старшими минорными версиями
  • 16-битный размер заголовка файла в байтах (28 в версии 1.0)
  • Размер заголовка 16-битного блока в байтах (12 в версии 1.0)
  • 32-битный размер блока в байтах, должен быть кратен 4
  • Всего 32-битных блоков в выходном файле
  • 32-битные куски во входном файле

32-битная контрольная сумма CRC32 исходных данных, считая «пофиг» как полином 0 по стандарту 802.3, использует реализацию таблицы из публичного домена

ломоть
  • 16-битный тип чанка:
    • 0xCAC1 raw
    • 0xCAC2 заполнить
    • 0xCAC3 пофиг
  • 16 бит зарезервировано (записать как 0, игнорировать при чтении)
  • 32-битный размер блока в блоках в выходном изображении
  • 32-битный общий размер в байтах входного файла чанка, включая заголовок чанка и данные
Данные
  • для необработанных необработанных данных, размер в блоках * размер блока в байтах
  • для заполнения, 4 байта данных заполнения
Реализация писателя

Утилита mke2fs уже знает, какие области изображения должны быть записаны, и будет кодировать фрагменты «все равно» между ними. Другой инструмент, img2simg , преобразует обычные (не разреженные) изображения в разреженные. Обычные изображения не имеют информации о «не заботящихся» областях; лучшее, что может сделать преобразование, - это искать блоки повторяющихся данных, чтобы уменьшить размер получаемого изображения.

Реализация читателя

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

После проверки основной версии читатель должен игнорировать порции с полями неизвестного типа. Следует пропустить чанк в файле, используя «размер чанка в файле» и пропустить блоки «размер чанка в блоках» на выходе.

Циклическая проверка избыточности - 802.3 CRC32 - должна быть рассчитана для данных, которые будут записаны на диск. Любая область, которая не записана (безразлично, или пропущенный кусок), должна считаться как 0 в CRC. Общее количество записанных или пропущенных блоков следует сравнить с полем «Всего блоков» в заголовке. Инструмент simg2img преобразует формат разреженного изображения в стандартное изображение, что приведет к потере разреженной информации.