1. Введение
Как оказалось, разметка физической памяти мобильных устройств (МУ) это малоописанный раздел знаний, необходимых разработчику. Т.к. память существует во всех устройствах, созданных на основе микропроцессоров или микроконтроллеров, а их уже миллиарды, то это еще и очень-очень востребованный раздел знаний.
Эта статья посвящена аспектам разметки памяти только МУ, т.к. именно здесь существует тесно свитый разными производителями клубок из файлов описания разметки при почти полном отсутствии теоретических данных о структуре самих этих файлов.
Разметка физической памяти МУ формируется на основании таблиц или списков описаний параметров разделов памяти. Практически каждая фирма-производитель МУ имеет свою форму (структуру) этих таблиц. Тем не менее, все описания параметров разделов имеют много общего, что позволяет рассматривать их в едином контексте.
На основе таблиц описаний затем формируются файлы разметки памяти, которые в виде образов разделов прошиваются непосредственно в память МУ.
2. Что такое разметка памяти?
Подробнее, что представляет собой разметка памяти МУ и для чего это нужно, можно посмотреть, например, в [1]. Вот еще одна публикация, в которой доступно объясняется устройство памяти и ее разметка [2].
Если кратко, то разметка памяти, как процесс, выполняет распределение всего объема внутренней физической памяти МУ на отдельные разделы, которые могут иметь разное функциональное назначение, вплоть до разных файловых систем, и разные права доступа. Это позволяет выделить в памяти отдельно области для хранения данных и работы пользователя, отдельно для работы операционной системы, шифровать или форматировать разделы при необходимости и независимо друг от друга и т.д.
При выполнении разметки разработчик МУ должен придерживаться некоторых правил, которые называются схемами разметки памяти. Схема разметки описывает размещение всех разделов физической памяти: их очередность, смещение и название, т.е. метку или имя раздела. Могут указываться и другие параметры: его размер, тип, регион, флаги и т.п.
Для выполнения разметки памяти используют файлы двух видов: текстовые и бинарные (двоичные RAW-файлы).
Текстовый файл представляет собой перечень (список) всех разделов памяти, каждая запись которого содержит описание основных параметров этих разделов. Он используется при выполнении нескольких операций:
- флешер заполняет разделы созданной разметки памяти МУ, т.е. прошивает образы разделов в них;
- при автоматическом создании бинарных файлов разметки, т.е. образа раздела разметки.
Бинарный файл разметки содержит разметку памяти в структурированном виде, понятном для работы операционных систем (ОС). Он размещается в прошивке МУ и затем прошивается в раздел разметки непосредственно в физическую память.
Процесс создания разметки памяти можно описать следующим алгоритмом:
- планируется последовательность размещения разделов памяти;
- создается текстовый файл описания всех разделов памяти, не забывая также и про сам раздел разметки;
- на основании данных текстового файла создаются бинарные файлы, представляющие собой образы описанных разделов памяти, в том числе и самого раздела разметки.
Давайте рассмотрим схемы разметки памяти и строение таблиц описаний параметров подробнее.
3. Схемы разметки памяти
Чаще всего применяются две схемы разметки памяти: Mbr и Gpt.
При любой схеме разметки памяти первым по порядку разделом в пользовательском регионе МУ всегда должен быть раздел разметки (Mbr, Gpt, Parameter).
3.1.Mbr-схема разметки памяти
Согласно Mbr-схеме память МУ представляется как последовательность разделов, дополненная главной загрузочной записью или Mbr (Master Boot Record), содержащей таблицу описания разделов. Mbr физически располагается в первом (нулевом) секторе памяти МУ:
рис.1. Главная загрузочная запись.
Mbr содержит сигнатуру, т.е. признак Mbr, и непосредственно саму таблицу описания разделов.
Внутреннее строение Mbr [3] позволяет разместить в ней только 4 записи о разделах, что является в современных условиях существенным недостатком. Если требуется разбить память на большее количество разделов, то используется дополнительная (расширенная) загрузочная запись Extended Boot Record (Ebr). При этом в Mbr вместо записи об одном из разделов помещается запись о дополнительном (extended) разделе, содержащем только Ebr.
Сама Ebr устроена аналогично Mbr, и использовать ее нужно точно также. Т.е., если при заполнении таблицы Ebr опять не хватает места под записи о разделах, то создается следующая Ebr-таблица и т.д.
Mbr и все Ebr могут помещаться в отдельные файлы-образы, которые размещаются и прошиваются в соответствующих отдельных разделах памяти. При этом все файлы, содержащие Ebr, имеют имена нумерованные последовательно: Ebr1, Ebr2,…
При другом варианте Ebr помещаются в один файл-образ последовательно, тогда этот образ, соответственно, размещается в одном Ebr-разделе памяти.
3.2. Gpt-схема разметки памяти
Gpt-схема разметки (GUID Partition Table) является частью EFI (Extensible Firmware Interface) — стандарта, используемого вместо BIOS для разметки памяти и загрузки ее разделов. Переход на другой формат описания разделов позволил устранить самый существенный недостаток Mbr-схемы — малое число разделов, т.к. в таблице описания разделов Gpt можно разместить до 128 разделов. Структуру самих таблиц можно посмотреть в [4].
Согласно Gpt-схеме память МУ тоже представляет собой последовательность разделов, необходимых для работы МУ, дополненную спереди Gpt-таблицей описания разделов, называемой основной. При этом после всех разделов размещается дополнительная Gpt-таблица, называемая резервной. Такое расположение таблиц, теоретически, повышает надежность разметки, т.к. при сбое или порче основной Gpt-таблицы ОС может использовать для работы, или восстановления основной, резервную.
4. Таблицы описания разделов памяти
Таблицы описания разделов памяти МУ содержат информацию о всех разделах, необходимую для создания разметки памяти. Каждая строка (запись) таблицы описывает один раздел и содержит, как правило, следующие параметры:
- — метка (название или имя) раздела;
- — смещение раздела.
Т.к. эти таблицы используются производителями МУ при выполнении непосредственно прошивки образов разделов в память при помощи флешеров (программаторов), то записи могут содержать дополнительные параметры, требуемые для правильной настройки свойств разделов, например:
- — имя файла, содержащего образ раздела;
- — размер раздела;
- — регион размещения раздела;
- — флаги раздела, например, «только для чтения», «шифрованный», «разрешена запись при работе Fastboot».
Физически таблицы описания разделов представляют собой текстовые файлы формата txt или xml. В моей практике встречались следующие их разновидности:
- — parameter-файл. Используется производителями МУ на основе чипов RK, формат — txt;
- — rawprogram0-файл. Используется производителями МУ на основе чипов Qualcomm, формат — xml;
- — ota-файл. Универсальный файл, используется для описания разметки прошивки всеми производителями МУ при автоматическом обновлении по «воздуху» (OTA-обновлении), формат — txt;
- — scatter-файл. Используется производителями МУ на основе чипов MTK, формат — txt.
Давайте рассмотрим их строение подробнее.
4.1. Parameter-файл
Прошивка МУ на чипе RK содержит текстовый файл PARAMETER, который предназначен для описания построения (настройки и загрузки) физической памяти блочного типа. Причем использовался он и на ОС LINUX.
Оригинальный вид содержимого файла PARAMETER для МУ Cube u30gt-M приведен ниже:
FIRMWARE_VER:4.0.4Рис.2. Файл PARAMETER фирмы RK
MACHINE_MODEL:U30GT-M
MACHINE_ID:007
MANUFACTURER:RK30SDK
MAGIC:0x5041524D
ATAG:0x60000800
MACHINE:3066
CHECK_MASK:0xFF
KERNEL_IMG:0x60408000
RECOVERY_KEY:0,4,C,6,0
COMBINATION_KEY:0,4,C,6,0
CMDLINE: console=ttyFIQ0 androidboot.console=ttyFIQ0 init=/init initrd=0x62000000,0x00800000 mtdparts=rk29xxnand:0x00002000@0x00002000(misc),0x00004000@0x00004000(kernel),0x00008000@0x00008000( boot),0x00008000@0x00010000(recovery),0x000C0000@0x00018000(backup),0x00040000@0x000D8000(cache),0x00200000@0x00118000(userdata),0x00002000@0x00318000(kpanic),0x00120000@0x0031A000(system),-@0x0043A000(user)
4.1.1. Описание параметров файла PARAMETER
Файл PARAMETER может содержать следующие параметры:
- параметр FIRMWARE_VER указывает номер версии прошивки, например, 4.0.4 или 1.11;
- параметр MACHINE_MODEL указывает НАЗВАНИЕ модели, для которой предназначена прошивка;
- параметр MACHINE_ID указывает идентификатор модели;
- параметр MANUFACTURER указывает фирму-изготовителя;
- параметр MAGIC содержит сигнатуру файла PARAMETER, которая содержит строку из 4 букв: "PARM".
- параметр ATAG. Значение мне не известно;
- параметр MACHINE указывает тип процессора, использованного в МУ;
- параметр CHECK_MASK. Значение мне не известно;
- параметр KERNEL_IMG содержит смещение в байтах образа ядра в памяти при начальной загрузке. Например, 0x6040800;
- параметр RECOVERY_KEY и COMBINATION_KEY. Их назначение мне не известно;
- параметр CMDLINE содержит командную строку, передаваемую ядру при запуске устройства.
Самый большой интерес для разработчика представляет параметр CMDLINE. Он содержит набор значений ключей для настройки Вашего устройства.
Рассмотрим строение параметра CMDLINE отдельно.
4.1.2. Параметр CMDLINE и его возможности
Формат командной строки, т.е. CMDLINE, имеет следующий вид:
CMDLINE: ключ1=значение1 [ключ2=значение2], где
- ключ1 — имя ключа 1;
- значение1 — значение ключа 1.
Вот список возможных ключей:
- console, androidboot.console указывает тип устройства консоли;
- init позволяет указать процесс, используемый при инициализации МУ;
- initrd позволяет указать параметры initrd, используемого при загрузке, т.е. смещение и размер этого раздела памяти;
- mtdparts содержит описание разметки памяти;
- root позволяет назначить папку для пользователя root.
В свою очередь параметр mtdparts имеет следующее строение:
mtdparts=<mtddef>[;<mtddef>], где
mtddef — описание разметки памяти устройства блочного типа (БУ). Если МУ содержит несколько БУ, то может содержать и несколько описаний, которые располагаются последовательно без промежутка и разделяются символом «точка с запятой».
Описание разметки памяти каждого БУ имеет следующее строение:
mtddef := <mtd-id>:<partdef>[,<partdef>], где
- mtd-id это имя драйвера (файла с расширением .ko), используемого для управления данным БУ (например, драйвер NAND-памяти rk29xxnand.ko);
- <partdef> это последовательность структур partdef, содержащих описание параметров раздела памяти (partition) данного БУ и разделенных символом «запятая» (",").
Каждая запись partdev содержит описание одного раздела памяти, за единицу измерения принят блок, размер которого составляет 0х200(512) байт, и имеет следующую структуру:
part_size@part_offset(label) [flag]
Параметр part_size описывает размер раздела в блоках, выраженный в hex-системе счисления. Если вместо размера указан символ «минус» ("-"), это означает максимально возможный размер, т.е. до физического конца памяти.
Параметр part_offset представляет смещение раздела в блоках, выраженный в hex-системе счисления. Смещение всегда выравнивается на границу в 0х1000.
Параметр label (имя раздела) это строковый идентификатор раздела, заключенный в круглые скобки, например, (boot).
Параметр flag (флаг) может принимать только одно значение — "ro", означающее, что раздел предназначен только для чтения. Отсутствие флага означает, что раздел доступен для чтения и записи.
Несколько очень важных замечаний:
- описание разметки памяти всех БУ, содержащихся в одном МУ, пишутся построчно для каждого БУ и разделяются символом «точка с запятой»;
- описание разметки памяти каждого БУ, т.е. всех разделов БУ, пишется в одну строку без переносов и переходов на другую. Записи разделов отделяются запятыми;
- разделы в памяти располагаются непрерывно, т.е. между ними нет «дыр».
4.2. Rawprogram0-файл
Файл rawprogram0.xml предназначен для описания разметки памяти МУ на основе чипов Qualcomm и имеет следующее строение:
rawprogram0-файл
Рис.3. Вид файла rawprogram0.xml от Lenovo s90a<?xml version="1.0" ?>
<data>
<!--NOTE: This is an ** Autogenerated file **-->
<!--NOTE: Sector size is 512bytes-->
<program ... filename="NON-HLOS.bin" label="modem" num_partition_sectors="131072" ... size_in_KB="65536.0" sparse="false" start_byte_hex="0x4000000" start_sector="131072" />
<program ... filename="sbl1.mbn" label="sbl1" num_partition_sectors="1024" ... size_in_KB="512.0" sparse="false" start_byte_hex="0x8000000" start_sector="262144" />
<program ... filename="sbl1.mbn" label="sbl1bak" num_partition_sectors="1024" ... size_in_KB="512.0" sparse="false" start_byte_hex="0x8080000" start_sector="263168" />
<program ... filename="emmc_appsboot.mbn" label="aboot" num_partition_sectors="4096" ... size_in_KB="2048.0" sparse="false" start_byte_hex="0x8100000" start_sector="264192" />
<program ... filename="emmc_appsboot.mbn" label="abootbak" num_partition_sectors="4096" ... size_in_KB="2048.0" sparse="false" start_byte_hex="0x8300000" start_sector="268288" />
...
<program ... filename="boot.img" label="boot" num_partition_sectors="40960" ... size_in_KB="20480.0" sparse="false" start_byte_hex="0xc00c000" start_sector="393312" />
<program ... filename="recovery.img" label="recovery" num_partition_sectors="40960" ... size_in_KB="20480.0" sparse="false" start_byte_hex="0xd40c000" start_sector="434272" />
<program ... filename="splash.img" label="splash" num_partition_sectors="40960" ... size_in_KB="20480.0" sparse="false" start_byte_hex="0xe80c000" start_sector="475232" />
...
<program ... filename="system_1.img" label="system" num_partition_sectors="262160" physical_partition_number="0" start_sector="1179648" />
<program ... filename="system_2.img" label="system" num_partition_sectors="16" physical_partition_number="0" start_sector="1442824" />
<program ... filename="system_3.img" label="system" num_partition_sectors="256992" physical_partition_number="0" start_sector="1446936" />
<program ... filename="system_4.img" label="system" num_partition_sectors="16" physical_partition_number="0" start_sector="1703936" />
<program ... filename="system_5.img" label="system" num_partition_sectors="258024" physical_partition_number="0" start_sector="1708048" />
...
<program ... filename="userdata_12.img" label="userdata" num_partition_sectors="16" physical_partition_number="0" start_sector="8302592" />
<program ... filename="userdata_13.img" label="userdata" num_partition_sectors="16" physical_partition_number="0" start_sector="8564736" />
<program ... filename="userdata_14.img" label="userdata" num_partition_sectors="16" physical_partition_number="0" start_sector="8565256" />
<program ... filename="gpt_main0.bin" label="PrimaryGPT" num_partition_sectors="34" ... size_in_KB="17.0" sparse="false" start_byte_hex="0x0" start_sector="0" />
<program ... filename="gpt_backup0.bin" label="BackupGPT" num_partition_sectors="33" ... size_in_KB="16.5" sparse="false" start_byte_hex="(512*NUM_DISK_SECTORS)-16896." start_sector="NUM_DISK_SECTORS-33." />
</data>
Он содержит таблицу описания параметров разделов в виде xml-элементов типа program. Все разделы перечисляются строго в порядке их размещения в памяти МУ.
Каждый xml-элемент может содержать следующие xml-атрибуты:
SECTOR_SIZE_IN_BYTES - размер сектора в байтах;
file_sector_offset - смещение в секторах начала размещения образа в файле, содержащем образ;
filename - имя файла, содержащего образ раздела;
label - метка раздела;
num_partition_sectors - размер раздела в секторах;
physical_partition_number - ;
size_in_kb - размер раздела, выраженный в Кб;
sparse - признак sparse-файла;
start_byte_hex - смещение раздела в секторе, выраженное в байтах;
start_sector - смещение раздела в памяти, выраженное в секторах.
4.3. Ota-файл
Это единственный файл описаний, который описывает строение файла прошивки, а не разметку памяти.
Например, файл ota-обновления МУ на чипе МТ6582 фирмы MTK, имеет следующий вид:
ota-файл
Рис.4. Файл otaPRELOADER 0x0
MBR 0x1400000
EBR1 0x1480000
PRO_INFO 0x1500000
NVRAM 0x1800000
PROTECT_F 0x1d00000
PROTECT_S 0x2700000
SECCFG 0x3100000
UBOOT 0x3120000
BOOTIMG 0x3180000
RECOVERY 0x4580000
SEC_RO 0x5980000
MISC 0x5f80000
LOGO 0x6000000
EXPDB 0x6300000
ANDROID 0x6d00000
CACHE 0x46d00000
USRDATA 0x72900000
Он содержит описание тех разделов, чьи образы присутствуют в файле прошивки для ota-обновления, каждое из которых имеет следующее строение:
label part_offset, где
- label — метка раздела подлежащего обновлению;
- part_offset — смещение образа раздела в файле ota-обновления.
Все образы в прошивке размещены строго последовательно без «дыр», поэтому размер каждого образа раздела part_size_n вычисляется по следующей формуле:
part_size_1 = part_offset_2 - part_offset_1
4.4. Scatter-файл
Файл scatter содержит описание разметки памяти МУ, построенных на основе чипов МТК. Существует три версии структуры этого файла, что связано с историческим развитием возможностей как самих чипов памяти, так и чипов процессоров фирмы MTK.
4.4.1. Версия 1
Файл описаний разметки первой версии содержит список описаний каждого раздела памяти, и имеет следующий вид:
scatter-файл версии 1
Рис.5. Scatter-файл первой версииPRELOADER 0x0000000000
{
}
MBR 0x0000600000
{
}
EBR1 0x0000680000
{
}
__NODL_PMT 0x0000700000
{
}
...
ANDROID 0x0005380000
{
}
CACHE 0x002DD80000
{
}
USRDATA 0x0035B80000
{
}
FAT 0x0095B80000
{
}
__NODL_BMTPOOL 0x07FEB00000
{
}
Каждый раздел памяти описывается следующей структурой:
[__NODL_]name offset [length]
{
flag
}, где
- __NODL_ — «No download» признак того, что раздел не прошивается и будет пропущен при обработке флешером. Соответственно, флешер не будет требовать наличие файла-образа этого раздела;
- name — метка раздела;
- offset — смещение раздела в байтах;
- length — длина раздела в байтах;
- flag — флаг раздела. Может содержать запись «ro», признак того, что раздел доступен только для чтения.
Чаще всего используется сокращенная запись вида:
name offset
{
}
Такое описание разделов памяти предполагает, что:
- каждый раздел имеет длину до начала следующего, без пропусков и разрывов;
- между двумя разделами не существует третьего (скрытого).
4.4.2. Версия 2
Scatter-файл описаний разметки памяти второй версии содержит заголовок и непосредственно таблицу описаний каждого раздела памяти. Он имеет следующий вид:
scatter-файл версии 2
Рис.6. Scatter-файл второй версии##########################################################
#
# General Setting
#
##########################################################
- general: MTK_PLATFORM_CFG
info:
- config_version: V1.1.2
platform: MT6592
project: vanzo92_wet_jb9
storage: EMMC
boot_channel: MSDC_0
block_size: 0x20000
##########################################################
#
# Layout Setting
#
##########################################################
- partition_index: SYS0
partition_name: PRELOADER
file_name: preloader_vanzo92_wet_jb9.bin
is_download: true
type: SV5_BL_BIN
linear_start_addr: 0x0
physical_start_addr: 0x0
partition_size: 0x40000
region: EMMC_BOOT_1
storage: HW_STORAGE_EMMC
boundary_check: true
is_reserved: false
operation_type: BOOTLOADERS
reserve: 0x00
- 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
Заголовок содержит параметры прошивки целиком и содержит следующие поля:
- config_version — версия заголовка. Может быть V1.1.1 или V1.1.2;
- platform — аппаратная платформа (тип чипа), например, МТ6582;
- project — название проекта разработки прошивки;
- storage — тип используемого устройства памяти, например, EMMC;
- boot_channel — тип устройства загрузки;
- block_size — размер блока в байтах, например, для EMMC это поле имеет значение 0х20000.
Каждый раздел памяти описывается следующим набором полей:
partition_index — метка раздела;
partition_name — имя раздела;
file_name — имя файла, содержащего образ для прошивания в разделе, или NONE, если образ не требуется;
is_download — признак загружаемости раздела (что-то типа __NODL_);
type — тип раздела. Указывает на содержимое раздела. Может принимать следующие значения:
- EXT4_IMG — раздел содержит часть файловой системы EXT4;
- NORMAL_ROM — раздел содержит сохраненный образ или отдельный файл;
- SV5_BL_BIN — раздел содержит «сырой код» (Raw Code) загрузчика;
physical_start_addr — смещение раздела в памяти МУ (физический адрес), байт;
partition_size — размер раздела в байтах;
region — название региона размещения раздела. Может принимать следующие значения:
- EMMC_BOOT_1 — первый регион (область) загрузчика;
- EMMC_BOOT_2 — второй регион загрузчика;
- EMMC_USER — пользовательский регион;
boundary_check — признак необходимости выравнивания границы раздела;
is_reserved — признак необходимости резервного копирования;
operation_type — тип операции. Может принимать следующие значения:
- BINREGION — область «сырого кода»;
- BOOTLOADERS — загрузчик;
- INVISIBLE — невидимый раздел;
- PROTECTED — защищенный раздел;
- RESERVED — зарезервирован;
- UPDATE — обновляемый раздел;
- reserve — значение мне не известно.
При работе флешер из таблицы описания разделов выбирает параметры, основными являются Begin Address и Format Length.
Для чипов МТ6572-МТ6577 в качестве значения Begin Address флешером используется значение поля linear_start_addr, отражающее истинное смещение раздела в памяти (представляющей один сплошной регион), т.к. чипы не умеют работать с регионами, а используемая память имела только один регион для размещения разделов. При этом значение поля «physical_start_addr» всегда равно нулю.
Чипы МТ6582 уже умеют работать с регионами, но используемая память еще имеет только один регион. Поэтому в качестве значения Begin Address флешером уже используется значение поля physical_start_addr, отражающее смещение раздела в пределах регионов, создаваемых в памяти программно, а поле linear_start_addr содержит значения смещения от начала чипа памяти.
В связи с тем, что, начиная с чипа МТ6592, МУ от МТК используют полноценную работу с регионами памяти, то для чипов МТ6592 и выше флешером в качестве значения Begin Address используется значение поля physical_start_addr.
Значение поля Format Length флешер всегда получает из поля partition_size.
5.Файлы разметки памяти.
Файлы разметки памяти содержат образ раздела разметки памяти МУ. Их структура зависит от схемы разметки (Gpt или Mbr) и от назначения, например, резервные файлы разметки Pmt или Gpt.
Встречаются следующие виды файлов разметки:
- Mbr-файл и Ebr-файл. Используются всеми производителями МУ, использующими Mbr-схему разметки памяти;
- Gpt-файл. Используются всеми производителями МУ, использующими Gpt-схему разметки памяти;
- Parameter-файл. Используется производителями МУ на основе чипов RK;
- Pmt-файл. Используется производителями МУ на основе чипов MTK для создания резервного файла разметки памяти;
- pit-файл. Используется производителями МУ на основе чипов Samsung.
5.1. Mbr-файл
Mbr-файл представляет собой образ раздела разметки памяти по Mbr-схеме, имеющий размер 1 сектор, т.е. 512 байт.
В МУ применяется так называемая классическая структура Mbr-файла [5]:
Рис.7. Классическая структура Mbr-файла
Каждая запись параметров раздела содержит следующие поля, значения которых отличается от принятых в классической структуре Mbr:
==============================================================
| № | Имя | Длина, | Смещение от | Описание |
| | | | начала записи| |
| п/п | поля | байт | hex | поля |
|=====|===========|========|==============|====================|
| 1 | IsBoot | 0х01 | 0x00 | Признак активности |
| 2 | - | 0х03 | 0x01 | Не используется |
| 3 | Type | 0х01 | 0x04 | Тип раздела |
| 4 | - | 0х03 | 0x05 | Не используется |
| 5 | Offset | 0x04 | 0x08 | Смещение раздела |
| 6 | Size | 0x04 | 0x0С | Размер раздела |
==============================================================
Поле IsBoot имеет размер 1 байт и используется для обозначения активности раздела, старший бит которого указывает на загрузочный раздел:
0х80 - раздел активен;
0х00 - раздел неактивен.
Поле Type имеет размер 1 байт и используется производителями МУ для обозначения типа описываемого раздела. Обозначение типа раздела у разных производителей могут отличаться, но есть некоторые общепринятые значения:
================================================================
| № | Тип | Значение | Описание типа |
| п/п | | hex | |
|=====|===========|==========|===================================|
| 01 | Not | 0x00 | раздел не занят |
| 02 | Fat12 | 0x01 | раздел Fat12 |
| 03 | Fat16 | 0x04 | раздел Fat16 |
| 04 | Extend | 0x05 | расширительный раздел (EBR) |
| 05 | Fat32 | 0x0B | раздел Fat32 |
| 06 | Fat32Lba | 0x0C | раздел Fat32 с использованием LBA |
| 07 | LinuxSwap | 0x82 | раздел Swap Linux |
| 08 | Linux | 0x83 | раздел Linux |
| 09 | LinuxEx | 0x85 | раздел Linux расширенный |
| 10 | Gpt | 0xEE | раздел GUID (GPT) |
| 11 | Bbt | 0xFF | Bad block table |
================================================================
Поле Offset имеет размер 4 байта и содержит значение смещения раздела, выраженное в секторах.
Поле Size имеет размер 4 байта и содержит значение размера раздела, выраженное тоже в секторах.
По адресу 0x01FE расположена сигнатура Mbr-файла, имеющая значение 0xAA55.
5.2. Ebr-файл
Ebr-файл представляет собой образ расширенного раздела разметки памяти, выполненной по Mbr-схеме. Он имеет такое же строение и размер, как и Mbr-файл:
Рис.8. Классическая структура Ebr-файла
Отличия заключаются в том, что в Ebr-файле признак активности всегда установлен в 0, да и этих файлов, при необходимости, может быть уже не один, а 63. Соответственно, для их размещения тоже понадобится создавать до 63 разделов, что приводит к расточительному расходованию памяти МУ.
Если разделов памяти относительно немного, например, как в МУ Star Z2, то используются отдельные файлы Ebr1 и Ebr2, размещаемые в отдельных разделах. Но, если разделов много, например,, то все файлы Ebr можно сложить в один и разместить общий файл в одном разделе памяти.
5.3. Gpt-файл
Gpt-файл содержит образ разметки памяти по Gpt-схеме. Чаще всего МУ имеют стандартную структуру Gpt-схемы, поэтому, фактически, в прошивке имеется два Gpt-файла: основной, называемый pgpt (primary) или gpt_main, и вторичный (резервный), называемый sgpt (secondary) или gpt_backup.
Основной Gpt-файл располагается в памяти МУ, начиная с нулевого сектора, занимает 34 сектора и имеет следующее строение:
- весь первый сектор занимает Mbr, называемый защитным (PMBR — protective master boot record);
- весь второй сектор занимает заголовок Gpt, имеющий тоже размер 512 байт;
- с третьего по 34 включительно (32 сектора) занимает Gpt-таблица описания разделов. Каждая запись имеет размер 128 байт, а всего в таблице может быть не более 128 записей, поэтому она и занимает 128 * 128 = 16384 байт, т.е. 32 сектора.
Резервный Gpt-файл занимает 33 сектора и располагается в памяти МУ, вплотную к концу памяти, так, что последний сектор Gpt-файла располагается в физически последнем секторе памяти. Он имеет следующее строение:
- с первого по 32 сектора (32 сектора) занимает Gpt-таблица описания разделов;
- весь 33 сектор занимает заголовок Gpt.
5.4. Parameter-файл
Parameter-файл, т.е. образ раздела, содержащего разметку памяти, содержит только сам текстовый файл PARAMETER, причем независимо от размеров этого раздела. Вот как Parameter-файл выглядит, например, внутри прошивки для устройства U30GT-H фирмы RK [6]:
Рис.9. Parameter-файл от U30GT-H на процессоре RK3066
5.5. Pmt-файл
Pmt-файл представляет собой образ резервного раздела разметки памяти, используемой разработчиками МУ фирмы МТК, и имеет размер 4096 байт.
Образ раздела PMT состоит из двух таблиц описания разделов памяти. В начале расположена базовая, а следом за ней резервная или зеркальная (mirror) таблица описания разделов.
Каждая из таблиц состоит из:
- — сигнатуры начала таблицы описания разделов. Для базовой таблицы это строка из следующих символов «PTv1»:
Рис.10.Сигнатура базовой таблицы
А для резервной таблицы эта строка имеет вид «MPT1»:
Рис.11.Сигнатура резервной таблицы
- — непосредственно самой таблицы, содержащей записи описания разделов памяти. Конец таблицы отмечается «пустой» записью, т.е. записью, содержащей код 0х00 во всех ее полях;
- — сигнатуры окончания таблицы. Для базовой таблицы это строка из следующих символов "'PTv1'\х01\х01\х03\х01":
Рис.12.Сигнатура конца базовой таблицы
Для резервной таблицы эта строка имеет вид "'MPT1'\х01\х00\х03\х01":
Рис.13.Сигнатура конца резервной таблицы
Структура каждой записи имеет размер 0х58 (88) байт состоит из 4 полей и имеет следующий вид:
========================================================
| № | Имя | Длина, | Смещение | Описание |
| п/п | поля | байт | hex | поля |
|=====|===========|========|==========|==================|
| 1 | Name | 0х40 | 0x00 | Метка раздела |
| 2 | Size | 0х08 | 0x40 | Длина раздела |
| 3 | Offset | 0x08 | 0x48 | Смещение раздела |
| 4 | mask_flag | 0x08 | 0x50 | Флаги |
========================================================
5.6. Pit-файл
Pit-файл (Partition Information Table) представляет собой образ раздела разметки памяти, используемой разработчиками МУ фирмы Samsung, и имеет размер 4096 байт. Информация по строению образа взята из [7, 8].
Pit-файл состоит из заголовка и таблицы описаний параметров разделов.
Заголовок имеет размер 28 байт и содержит следующие поля:
======================================================
| № | Имя | Длина, | Смещение | Описание |
| п/п | поля | байт | hex | поля |
|=====|========|========|==========|===================|
| 1 | Magic | 0х04 | 0x00 | Сигнатура файла |
| 2 | Count | 0х04 | 0x04 | Число разделов |
| 3 | Name | 0х18 | 0x08 | Название прошивки |
======================================================
Следом располагается таблица описаний параметров разделов, состоящая из записей о разделах. Признак конца таблицы — пустая запись. Каждая запись содержит следующие поля:
================================================================
| № | Тип | Значение | Описание типа |
| п/п | | hex | |
|=====|===========|==========|===================================|
| 01 | binary | 0x00 | BINARY_TYPE_ |
| 02 | device | 0x04 | PARTITION_DEV_TYPE_ |
| 03 | id | 0x08 | Идентификатор раздела |
| 04 | flags | 0x0C | Флаги раздела |
| 05 | update | 0x10 | PARTITION_UPDATE_ATTR |
| 06 | part_off | 0x14 | Смещение раздела в блоках |
| 07 | part_len | 0x18 | Размер раздела в блоках |
| 08 | offset | 0x1C | Смещение файла-образа в прошивке |
| 09 | file_size | 0x20 | размер файла-образа раздела |
| 10 | label | 0x24 | Метка раздела |
| 11 | file_name | 0x44 | Имя файла-образа при прошивке |
| 11 | fota_name | 0x64 | Имя файла при FOTA-обновлении |
================================================================
Поле binary содержит тип операционной системы. Допустимы следующие значения:
0 - APP (ОС для обработки приложений);
1 - MODEM (ОС для работы модема).
Поле device содержит тип устройства. Допустимы следующие значения:
0 - unknown;
1 - file/fat;
2 - mmc;
Поле id содержит порядковый номер раздела в прошивке.
Поле flags содержит флаги раздела. Может принимать значения:
0х00 - RO;
0х01 - R/W;
0x02 - STL.
Поле update содержит флаги раздела при обновлении. Может принимать значения:
0x00 - unknown;
0x01 - FOTA;
0x02 - secure;
Поле part_off содержит смещение раздела в памяти, выраженное в блоках.
Поле part_len содержит размер раздела в памяти, выраженный в блоках.
Поле offset содержит смещение файла-образа в прошивке, выраженное в блоках.
Поле file_size содержит размер файла-образа, выраженный в блоках.
Поле label имеет длину 32 байта и содержит метку раздела памяти, завершенную нулем (0х00).
Поле file_name содержит имя файла-образа раздела прошивки, завершенное нулем (0х00).
Поле fota_name содержит имя файла-образа раздела прошивки FOTA-обновления, завершенное нулем (0х00).
6.Использованная информация.
1. «Что такое разметка памяти?»
2. «Введение в разметку дисков»
3. «Что такое MBR и EBR?»
4. «Что такое GPT?»
5. «Master boot record»
6. «Сток-прошивка v1.09 (2012-11-21)»
7. Файл bootloader.c
8. PIT
Комментарии (5)
r3nr5v
07.01.2018 16:23разметка физической памяти мобильных устройств (МУ)
Совершенно нелишним будет указать область применения…
Какие именно МУ имеются ввиду?
Если я разрабатываю, например для iOS, оно мне надо читать?vin2809 Автор
07.01.2018 16:32Ничего не знаю про iOS, никогда не занимался. А вот судя по тому, что
Начиная с самой первой версии, iOS работает только на планшетных компьютерах и смартфонах с процессорами архитектуры ARM.
можете почитать.
Т.к. iOS это операционная система (ОС), а ОС вступает в права уже после разметки, то Вы в публикации должны найти для себя что-то интересное.
kAIST
07.01.2018 16:45На Хабре иногда попадаются статьи, как будто просто реферат скопипастили. Написано очень сухо и формально.
vin2809 Автор
07.01.2018 16:53+1Если Вы имеете ввиду мою публикацию, то ее основная цель — дать основы внутреннего строения образов прошивок (Firmware). Иначе как Вы себе представляете, например, описание таблицы умножения? Сразу — основы, затем — «разбор полетов».
В перспективе будут статьи с чисто практическими решениями тех или иных задач: разборка/сборка прошивок, внесение в них изменений и т.д.
VBKesha
Спасибо.
В закладки.