Что такое scatter-файл?

Разметка памяти, то есть разбивка на разделы, на устройствах с чипсетом MediaTek происходит при помощи файла, который называется "scatter-файл". Данный файл используется программой по прошивке устройств на MeidiaTek, а именно SP Flash Tool, при прошивке полного образа памяти устройства или же его отдельных частей, так называемых разделов. Структура scatter-файла содержит описание всех существующих разделов памяти устройства. Существует две версии scatter-файла.

Scatter-файл первой версии


Данная версия scatter-файла используется на большинстве устройств на MediaTek. Полное описание раздела памяти представляет из себя следующее:

Код:
[__NODL_]name offset [length]
{
}

Здесь:

  • __NODL_ (No download) - означет что данный раздел памяти будет пропущен программой по прошивке и для работы данного раздела не требуется его наличие. Такой раздел можно вообще исключить из scatter-файла;
  • name - имя раздела;
  • offset - смещение раздела от начала памяти в 16-ричном виде (байт);
  • length - длина раздела в 16-ричном виде (байт);
  • параметры в квадратных скобках не обязательные



Описание раздела такого вида, предполагает что каждый раздел имеет длину до начала следующего и что между двумя разделами не существует третьего, скрытого раздела. Ниже приведёт пример scatter-файла первой версии для MediaTek MT6589:

Код:
PRELOADER 0x0
{
}
MBR 0x600000
{
}
EBR1 0x680000
{
}
__NODL_PMT 0x700000
{
}
__NODL_PRO_INFO 0xb00000
{
}
__NODL_NVRAM 0xe00000
{
}
__NODL_PROTECT_F 0x1300000
{
}
__NODL_PROTECT_S 0x1d00000
{
}
__NODL_SECCFG 0x2700000
{
}
UBOOT 0x2720000
{
}
BOOTIMG 0x2780000
{
}
RECOVERY 0x2d80000
{
}
SEC_RO 0x3380000
{
}
__NODL_MISC 0x3980000
{
}
LOGO 0x3a00000
{
}
EBR2 0x3d00000
{
}
__NODL_EXPDB 0x3d80000
{
}
ANDROID 0x4780000
{
}
CACHE 0x2d180000
{
}
USRDATA 0x34f80000
{
}
__NODL_FAT 0x74f80000
{
}
__NODL_BMTPOOL 0xffff00a8
{
}


Scatter-файл второй версии



В данном варианте scatter-файла, полное описание каждого отдельного раздела памяти представляет собой следующий набор строк:

Код:
partition_index: SYS1
  partition_name: MBR
  file_name: MBR
  is_download: true
  type: NORMAL_ROM
  linear_start_addr: 0x0
  physical_start_addr: 0x0
  partition_size: 0x80000
  region: EMMC_USER
  storage: HW_STORAGE_EMMC
  boundary_check: true
  is_reserved: false
  operation_type: UPDATE
  reserve: 0x00

Здесь:

  • partition_index - индексный номер раздела, в нашем примере SYS1;
  • partition_name - имя раздела, в нашем примере MBR;
  • file_name - имя файла который содержим образ данного раздела или "NONE" (значит нет раздела);
  • is_download - параметр определящий будет ли загружен раздел, по типу "__NODL_" из первого варианта scatter-файла;
  • type - тип раздела, параметр который указывает содержимое данного раздела, может принимать следующие значения:

    • EXT4_IMG - раздел содержащий часть файловой системы EXT4;
    • NORMAL_ROM - раздел содержащий сохранённый образ или отдельный файл;
    • SV5_BL_BIN - раздела содержащий, так называемый, "сырой код" (Raw code), то есть исполняемый код;
  • linear_start_addr - начальный адрес размещения раздела в файле прошивки (байт);
  • physical_start_addr - начальный адрес размещения раздела в памяти устройства, то есть физический адрес (байт);
  • partition_size - размер раздела (байт);
  • region - размещение раздела, может иметь следующие значения:

    • EMMC_BOOT -
    • EMMC_USER -
  • storage -
  • boundary_check - означает необходимость отметки границ раздела;
  • is_reserved - нужно ли резервное копирование раздела;
  • operation_type - тип операции, может иметь следующие значения:

    • BINREGION - обасть "сырого кода" (raw code);
    • BOOTLOADERS - загрузчик;
    • INVISIBLE - невидимый раздел;
    • PROTECTED - защищённый раздел;
    • RESERVED - зарезервированный раздел;
    • UPDATE - обновляемый раздел:
  • reserve -



Работа со scatter-файлом:



SP Flash Tool использует scatter-файл, только для полной разметки памяти, если вы прошиваете один или несколько разделов, то программа по прошивке берёт расположение разделов из внутренней базы, а именно файла PMT (Partitions Map Table). Происходит считывание значения смещения раздела, то есть физический адрес, и прошивается образ раздела в память, начиная с физического адреса.

Поскольку scatter-файл содержит список всех физических адресов разделов, то изменив его можно произвести переразметку памяти. Делается это путем смены значений смещения необходимых разделов. Нарпимер, такой раздел как USRDATA содержит в себе данные программ пользователя, поэтому чаще всего переполняется и ползователь может увидеть сообщения типа "Память переполнена" и так далее. В обычном scatter-файле, данный раздел имеет смещение "0x34f80000" и размер "0x74f80000-0x34f80000=0х40000000" (или 1073741824= 1Гб). Если увеличить данный раздел на 256 Мб (268435456), то "1073741824+268435456=1342177280 (или 0х50000000 в hex), то есть мы добавили в раздел еще 0х10000000. При этом смещение данного раздела переместится на эту же величину: было 0х74f80000, а стало 0х84f80000. Если поступить таким образом со смещением всех разделов, то они все переместятся на данную величину, что увеличит общий размер памяти занимаемый прошивкой, а этого делать нельзя. Поэтому необходимо уменьшить размер какого-то из последующих разделов, в нашем случае это FAT (раздел пользователя)