Как происходит запись прошивки Android с карты Product


   1       2       3       4       5       6         7         8       9       10   

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




   1       2       3       4       5       6         7         8       9       10