7. Чтение содержимого файла sunxi_MBR
В логе присутствует срока:
fetch mbr - это чтение содержимого файла sunxi_MBR из образа прошивки, которое выполняется
функцией sprite_card_fetch_mbr. Поиск выполняется по заголовку 1234567890___MBR
tick_printf("fetch mbr\n");
if (sprite_card_fetch_mbr(img_mbr))
{ printf("sunxi sprite error : fetch mbr error\n");
return -1;
}
__dump_mbr((sunxi_mbr_t *)img_mbr);
#define SUNXI_MBR_COPY_NUM 4 // число резервных копий mbr
//---------------------------------
int sprite_card_fetch_mbr(void *img_mbr)
{ int mbr_num = SUNXI_MBR_COPY_NUM;
imgitemhd = Img_OpenItem(imghd, "12345678", "1234567890___MBR");
if (!imgitemhd)
return -1;
debug("try to read item mbr");
if (!Img_ReadItem(imghd, imgitemhd, img_mbr,
sizeof(sunxi_mbr_t) * mbr_num))
{ printf("sunxi sprite error : read mbr failed");
return -1;
}
Img_CloseItem(imghd, imgitemhd);
imgitemhd = NULL;
return sunxi_sprite_verify_mbr(img_mbr);
}
Прочитанный sunxi_MBR.fex выводится на терминал в виде дампа функцией
__dump_mbr((sunxi_mbr_t *)img_mbr):
//-----------------------------------------
void __dump_mbr(sunxi_mbr_t *mbr_info)
{ sunxi_partition *part_info;
u32 i;
char buffer[32];
printf("*************MBR DUMP***************\n");
printf("total mbr part %d\n", mbr_info->PartCount);
printf("\n");
for (part_info = mbr_info->array, i = 0; i < mbr_info->PartCount;
i++, part_info++)
{ memset(buffer, 0, 32);
memcpy(buffer, part_info->name, 16);
printf("part[%d] name :%s\n", i, buffer);
memset(buffer, 0, 32);
memcpy(buffer, part_info->classname, 16);
printf("part[%d] classname :%s\n", i, buffer);
printf("part[%d] addrlo :0x%x\n", i, part_info->addrlo);
printf("part[%d] lenlo :0x%x\n", i, part_info->lenlo);
printf("part[%d] user_type :0x%x\n", i, part_info->user_type);
printf("part[%d] keydata :0x%x\n", i, part_info->keydata);
printf("part[%d] ro :0x%x\n", i, part_info->ro);
printf("\n");
}
}
typedef struct sunxi_partition_t
{
unsigned int addrhi; // начальный адрес в секторах
unsigned int addrlo;
unsigned int lenhi; // длина
unsigned int lenlo;
unsigned char classname[16]; // имя вторичного устройства
unsigned char name[16]; // имя основного устройства
unsigned int user_type; // тип пользователя
unsigned int keydata; // Ключевые данные, которые
не должны быть потеряны при обновлении прошивки
unsigned int ro; // атрибуты чтения и записи
unsigned int sig_verify; // Атрибут проверки подписи;
unsigned int sig_erase; // Атрибут стирания подписи;
unsigned int sig_value[4];
unsigned int sig_pubkey;
unsigned int sig_pbumode;
unsigned char reserved2[36]; //Зарезервированные данные,
соответствующие информации о разделе 128 байт;
}__attribute__ ((packed))sunxi_partition;
Содержимое файла sunxi_MBR.fex имеет двоичный формат, однако утилита partitions32.exe
показывает его в виде читабельной таблицы, содержащей 25 строк (по количеству разделов в GPT).
Сравнение этой таблицы с показанным ниже дампом в логе показывает их полное совпадение.
Кроме того, эта утилита показывает, что данная таблица содержится в файле в четырех копиях:
sector = 512 byte
Base address = 0x00008000
Total occupe: 3428 Mb Disk size: 4764 Mb
======================
CRC32: 3C1555A1 version: 00000200 magic: "softw411"
Blocks copy: 4 index: 0 Partition Count: 25
======================
CRC32: A9A804FC version: 00000200 magic: "softw411"
Blocks copy: 4 index: 1 Partition Count: 25
======================
CRC32: CC1EF15A version: 00000200 magic: "softw411"
Blocks copy: 4 index: 2 Partition Count: 25
======================
CRC32: 59A3A007 version: 00000200 magic: "softw411"
Blocks copy: 4 index: 3 Partition Count: 25
Лог: Чтение содержимого файла sunxi_MBR
[05.577]fetch mbr
the 0 mbr table is ok
the 1 mbr table is ok
the 2 mbr table is ok
the 3 mbr table is ok
*************MBR DUMP***************
total mbr part 25
part[0] name :bootloader_a
part[0] classname :DISK
part[0] addrlo :0x8000
part[0] lenlo :0x10000
part[0] user_type :32768
part[0] keydata :0
part[0] ro :0
part[1] name :bootloader_b
part[1] classname :DISK
part[1] addrlo :0x18000
part[1] lenlo :0x10000
part[1] user_type :32768
part[1] keydata :0
part[1] ro :0
part[2] name :env_a
part[2] classname :DISK
part[2] addrlo :0x28000
part[2] lenlo :0x200
part[2] user_type :32768
part[2] keydata :0
part[2] ro :0
part[3] name :env_b
part[3] classname :DISK
part[3] addrlo :0x28200
part[3] lenlo :0x200
part[3] user_type :32768
part[3] keydata :0
part[3] ro :0
part[4] name :boot_a
part[4] classname :DISK
part[4] addrlo :0x28400
part[4] lenlo :0x20000
part[4] user_type :32768
part[4] keydata :0
part[4] ro :0
part[5] name :boot_b
part[5] classname :DISK
part[5] addrlo :0x48400
part[5] lenlo :0x20000
part[5] user_type :32768
part[5] keydata :0
part[5] ro :0
part[6] name :vendor_boot_a
part[6] classname :DISK
part[6] addrlo :0x68400
part[6] lenlo :0x10000
part[6] user_type :32768
part[6] keydata :0
part[6] ro :0
part[7] name :vendor_boot_b
part[7] classname :DISK
part[7] addrlo :0x78400
part[7] lenlo :0x10000
part[7] user_type :32768
part[7] keydata :0
part[7] ro :0
part[8] name :super
part[8] classname :DISK
part[8] addrlo :0x88400
part[8] lenlo :0x600000
part[8] user_type :32768
part[8] keydata :0
part[8] ro :0
part[9] name :misc
part[9] classname :DISK
part[9] addrlo :0x688400
part[9] lenlo :0x8000
part[9] user_type :32768
part[9] keydata :0
part[9] ro :0
part[10] name :vbmeta_a
part[10] classname :DISK
part[10] addrlo :0x690400
part[10] lenlo :0x100
part[10] user_type :32768
part[10] keydata :0
part[10] ro :0
part[11] name :vbmeta_b
part[11] classname :DISK
part[11] addrlo :0x690500
part[11] lenlo :0x100
part[11] user_type :32768
part[11] keydata :0
part[11] ro :0
part[12] name :vbmeta_system_a
part[12] classname :DISK
part[12] addrlo :0x690600
part[12] lenlo :0x80
part[12] user_type :32768
part[12] keydata :0
part[12] ro :0
part[13] name :vbmeta_system_b
part[13] classname :DISK
part[13] addrlo :0x690680
part[13] lenlo :0x80
part[13] user_type :32768
part[13] keydata :0
part[13] ro :0
part[14] name :vbmeta_vendor_a
part[14] classname :DISK
part[14] addrlo :0x690700
part[14] lenlo :0x80
part[14] user_type :32768
part[14] keydata :0
part[14] ro :0
part[15] name :vbmeta_vendor_b
part[15] classname :DISK
part[15] addrlo :0x690780
part[15] lenlo :0x80
part[15] user_type :32768
part[15] keydata :0
part[15] ro :0
part[16] name :frp
part[16] classname :DISK
part[16] addrlo :0x690800
part[16] lenlo :0x400
part[16] user_type :32768
part[16] keydata :32768
part[16] ro :0
part[17] name :empty
part[17] classname :DISK
part[17] addrlo :0x690c00
part[17] lenlo :0x7800
part[17] user_type :32768
part[17] keydata :0
part[17] ro :0
part[18] name :metadata
part[18] classname :DISK
part[18] addrlo :0x698400
part[18] lenlo :0x8000
part[18] user_type :32768
part[18] keydata :0
part[18] ro :0
part[19] name :private
part[19] classname :DISK
part[19] addrlo :0x6a0400
part[19] lenlo :0x8000
part[19] user_type :32768
part[19] keydata :0
part[19] ro :0
part[20] name :dtbo_a
part[20] classname :DISK
part[20] addrlo :0x6a8400
part[20] lenlo :0x1000
part[20] user_type :32768
part[20] keydata :0
part[20] ro :0
part[21] name :dtbo_b
part[21] classname :DISK
part[21] addrlo :0x6a9400
part[21] lenlo :0x1000
part[21] user_type :32768
part[21] keydata :0
part[21] ro :0
part[22] name :media_data
part[22] classname :DISK
part[22] addrlo :0x6aa400
part[22] lenlo :0x8000
part[22] user_type :32768
part[22] keydata :0
part[22] ro :0
part[23] name :Reserve0
part[23] classname :DISK
part[23] addrlo :0x6b2400
part[23] lenlo :0x8000
part[23] user_type :32768
part[23] keydata :0
part[23] ro :0
part[24] name :UDISK
part[24] classname :DISK
part[24] addrlo :0x6ba400
part[24] lenlo :0x0
part[24] user_type :33024
part[24] keydata :0
part[24] ro :0