Образ Android


  Образ       Файлы       GPT     Разделы     RAW  

  super.fex     boot-resource.fex       boot_package.fex       boot0_sdcard.fex     cardscript.fex     cardtool.fex     split_xxxx.fex     fes1.fex  

Файл boot_package.fex

Файл boot_package.fex представляет собой архив специального формата,состоящий из заголовка архива и содержимого упакованных файлов (item). Заголовок начинается с сигнатуры sunxi-package и имеет длину 2048 байт.

Структура заголовка пакета boot_package.fex, имеющего размер 64 байта:



#define TOC_MAIN_INFO_MAGIC 0x89119800
typedef struct head_info // заголовок с общей информацией о пакете
{
char name[16] ; // пользователь может изменить
u32 magic ; // должен быть равен TOC_MAIN_INFO_MAGIC
u32 add_sum ; // контрольная сумма
u32 serial_num ; // пользователь может изменить
u32 status ; // пользователь может изменить
u32 items_nr ; // общее количество записей (файлов) = 4
u32 valid_len ; // размер файла boot_package.fex
u32 version_main; // только один байт
u32 version_sub ; // два байта
u32 reserved[3] ; // зарезервировано
u32 end;
}

Дальше лежат четыре заголовка для каждого item (т.е. содержимого упакованных файлов). Размер каждого заголовка 368 байт.

Структура заголовка каждого item:



typedef struct item_info // {
char name[64]; // имя файла, например monitor
u32 data_offset; // смещение
u32 data_len; // размер
u32 encrypt; // шифрование 0: нет AES, 1: AES
u32 type; // 0: обычный файл, все равно
// 1: ключ сертификата
// 2: подпись сертификата
// 3: бинарный файл
u32 run_addr; // если это bin-файл, то запускать по этому адресу;
// если нет, то должно быть 0
u32 index; // если это bin-файл, то значение показывает индекс для запуска
// если это файл сертификата, он должен быть равен индексу файла bin,
// это означает, что они в одной группе
// должно быть = 0 для любого другого типа данных
u32 reserved[69];// зарезервировано на будущее;
u32 end;
}

Таким образом, общий размер заголовка пакета:
64 + 368 * 4 = 1536 + 512 (выравнивание до 1024) = 2048 При этом общий размер пакета (т.е. файла boot_package) должен быть выравнен кратно 16 Кбайт (16*1024).

В пакете boot_package.fex лежат 4 бинарных файла (точнее, их содержимое): u-boot, monitor, dtbo, dtb.
Ниже приведены их размеры и смещение внутри архива.

  • u-boot: начало = 2048 (0x800), конец = 1017856 (0xf8800), длина = 1015808

  • monitor: начало = 1017856 (0xf8800), конец = 1120832 (0x111a40), длина = 102976

  • dtbo: начало = 1121280 (0x111c00), конец = 1125824 (0x112dc0), длина = 4544

  • dtb: начало = 1126400 (0x113000), конец = 1255936 (0x132a00), длина = 129536

    Для распаковки-упаковки пакета boot_package.fex была использована специально написанная платформо-независимая утилита с веб-интерфейсом: Как распаковать файл boot_package

    Размеры полученных при распаковке с её помощью файлов совпадают с размерами двоичных массивов в пакете. Бинарное сравнение исходного файла пакета с файлом, упакованным этой утилитой, показало их идентичность.

    Примечание. Имеется также консольная утилита под линуксом dragonsecboot, которая умеет упаковывать файлы в пакет boot_package.

    Кратко о назначении этих файлов (их содержимого):

  • u-boot - это основной вторичный загрузчик, более подробно о командном интерфейсе - Команды U-Boot
  • dtb и dtbo - дерево устройств FDT, более подробно - Дерево устройств
  • monitor (или точнее, Secure Monitor) управляет доверенной загрузкой, т.е. выбором режимов работы Secure – Non-secure (подробности, возможно, будут опубликованы позже).

    В процессе загрузки системы загрузчик Bооt0 находит массив boot_package в неразмеченной области карты по заданному смещению и извлекает из него содержимое файлов.

    В логе загрузки это отображается строками:

  • [mmc]: ***SD/MMC 0 init OK!!!***
  • Loading boot-pkg Succeed(index=0).
  • Entry_name = u-boot
  • Entry_name = monitor
  • Entry_name = dtbo
  • Entry_name = dtb
  • Jump to second Boot - переход к вторичному загрузчику, т.е. к U-Boot

    Далее в логе загрузки следуют строки, также имеющие отношение к Secure Monitor:

  • NOTICE: BL3-1: v1.0(debug):9fecd83
  • NOTICE: BL3-1: Built : 17:08:29, 2020-05-28
  • NOTICE: BL3-1 commit: 8
  • ERROR: Error initializing runtime service tspd_fast
  • NOTICE: BL3-1: Preparing for EL3 exit to normal world
  • NOTICE: BL3-1: Next image address = 0x4a000000
  • NOTICE: BL3-1: Next image spsr = 0x1d3

    Необходимо отметить, что пакет boot_package.fex является наиболее важным компонентом образа, определяющим особенности "железа" конкретного устройства, т.е. набора компонентов, портов, схемотехники и т.д. Даже для одинаковых моделей могут существовать платы разных ревизий, и в этом случае необходимые изменения вносятся именно в файлы, входящие в состав этого пакета.

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