Что такое 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 (раздел пользователя)