Partition table format of Phicomm N1Found at offset 0x2400000
of /dev/mmcblk1
:
123456789101112131415161718192021222324252627282930313233343536 Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 02400000 4D 50 54 00 30 31 2E 30 30 2E 30 30 00 00 00 00 MPT 01.00.00 02400010 0D 00 00 00 97 1F E1 05 62 6F 6F 74 6C 6F 61 64 ??bootload02400020 65 72 00 00 00 00 00 00 00 00 40 00 00 00 00 00 er @ 02400030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02400040 72 65 73 65 72 76 65 64 00 00 00 00 00 00 00 00 reserved 02400050 00 00 00 04 00 00 00 00 00 00 40 02 00 00 00 00 @ 02400060 00 00 00 00 00 00 00 00 63 61 63 68 65 00 00 00 cache 02400070 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 02400080 00 00 C0 06 00 00 00 00 02 00 00 00 00 00 00 00 ? 02400090 65 6E 76 00 00 00 00 00 00 00 00 00 00 00 00 00 env 024000A0 00 00 80 00 00 00 00 00 00 00 50 07 00 00 00 00 € P 024000B0 00 00 00 00 00 00 00 00 6C 6F 67 6F 00 00 00 00 logo 024000C0 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 024000D0 00 00 50 08 00 00 00 00 01 00 00 00 00 00 00 00 P 024000E0 72 65 63 6F 76 65 72 79 00 00 00 00 00 00 00 00 recovery 024000F0 00 00 00 02 00 00 00 00 00 00 C0 2A 00 00 00 00 ? 02400100 01 00 00 00 00 00 00 00 72 73 76 00 00 00 00 00 rsv 02400110 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 00 € 02400120 00 00 40 2D 00 00 00 00 01 00 00 00 00 00 00 00 @- 02400130 74 65 65 00 00 00 00 00 00 00 00 00 00 00 00 00 tee 02400140 00 00 80 00 00 00 00 00 00 00 40 2E 00 00 00 00 € @. 02400150 01 00 00 00 00 00 00 00 63 72 79 70 74 00 00 00 crypt 02400160 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 02400170 00 00 40 2F 00 00 00 00 01 00 00 00 00 00 00 00 @/ 02400180 6D 69 73 63 00 00 00 00 00 00 00 00 00 00 00 00 misc 02400190 00 00 00 02 00 00 00 00 00 00 C0 31 00 00 00 00 ? 024001A0 01 00 00 00 00 00 00 00 62 6F 6F 74 00 00 00 00 boot 024001B0 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 024001C0 00 00 40 34 00 00 00 00 01 00 00 00 00 00 00 00 @4 024001D0 73 79 73 74 65 6D 00 00 00 00 00 00 00 00 00 00 system 024001E0 00 00 00 50 00 00 00 00 00 00 C0 36 00 00 00 00 P ? 024001F0 01 00 00 00 00 00 00 00 64 61 74 61 00 00 00 00 data 02400200 00 00 00 00 00 00 00 00 00 00 C0 4A 01 00 00 00 繨 02400210 00 00 40 87 00 00 00 00 04 00 00 00 00 00 00 00 @?
Looks like it’s using format below:
1234567891011 PartitionTable: 16bytes: [signature] # = 'MPT\x0001.00.00\x00\x00\x00\x00' uint32: [number_of_partitions] array of `PartitionEntry` checksum of partition entries PartitionEntry: 16bytes: [lable] uint64: [size_in_bytes] uint64: [start_off_in_bytes] uint64: [mask] # Defined in DTB. But what is it?
Found some code about this: Structure definition of partitions
(and mask?), The partition table structure.
I also found (presumbly) a BUG in checksum calculation: The checksum is actually calculated as (uint32)(checksum-of-first-partition * number-of-partitions)
, any partition other than the first one is not taken into consideration. And as such, a simple equation for calculating the checksum would be (uint32)(0xD9115133 * number_of_partitions)
.
I tried to move partition logo
to somewhere more near to the beginning of the eMMC, but seems not work, not sure if the offset is also saved elsewhere.
The partition table itself is in reserved
. Some code whose purpose is unclear is also in it.
The bootloader code starts from the second sector (512 byte) of /dev/mmcblk1
. Which means the first sector is not used. And thus it’s possible to partition /dev/mmcblk1
as MBR, as MBR only uses the first sector to store metadata. As long as the first partition starts after thoes special partitions (bootloader
, reserved
, but nothing else), the system still boots.
Found at offset 0x2400000
of /dev/mmcblk1
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 02400000 4D 50 54 00 30 31 2E 30 30 2E 30 30 00 00 00 00 MPT 01.00.00 02400010 0D 00 00 00 97 1F E1 05 62 6F 6F 74 6C 6F 61 64 ??bootload 02400020 65 72 00 00 00 00 00 00 00 00 40 00 00 00 00 00 er @ 02400030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02400040 72 65 73 65 72 76 65 64 00 00 00 00 00 00 00 00 reserved 02400050 00 00 00 04 00 00 00 00 00 00 40 02 00 00 00 00 @ 02400060 00 00 00 00 00 00 00 00 63 61 63 68 65 00 00 00 cache 02400070 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 02400080 00 00 C0 06 00 00 00 00 02 00 00 00 00 00 00 00 ? 02400090 65 6E 76 00 00 00 00 00 00 00 00 00 00 00 00 00 env 024000A0 00 00 80 00 00 00 00 00 00 00 50 07 00 00 00 00 € P 024000B0 00 00 00 00 00 00 00 00 6C 6F 67 6F 00 00 00 00 logo 024000C0 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 024000D0 00 00 50 08 00 00 00 00 01 00 00 00 00 00 00 00 P 024000E0 72 65 63 6F 76 65 72 79 00 00 00 00 00 00 00 00 recovery 024000F0 00 00 00 02 00 00 00 00 00 00 C0 2A 00 00 00 00 ? 02400100 01 00 00 00 00 00 00 00 72 73 76 00 00 00 00 00 rsv 02400110 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 00 € 02400120 00 00 40 2D 00 00 00 00 01 00 00 00 00 00 00 00 @- 02400130 74 65 65 00 00 00 00 00 00 00 00 00 00 00 00 00 tee 02400140 00 00 80 00 00 00 00 00 00 00 40 2E 00 00 00 00 € @. 02400150 01 00 00 00 00 00 00 00 63 72 79 70 74 00 00 00 crypt 02400160 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 02400170 00 00 40 2F 00 00 00 00 01 00 00 00 00 00 00 00 @/ 02400180 6D 69 73 63 00 00 00 00 00 00 00 00 00 00 00 00 misc 02400190 00 00 00 02 00 00 00 00 00 00 C0 31 00 00 00 00 ? 024001A0 01 00 00 00 00 00 00 00 62 6F 6F 74 00 00 00 00 boot 024001B0 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 024001C0 00 00 40 34 00 00 00 00 01 00 00 00 00 00 00 00 @4 024001D0 73 79 73 74 65 6D 00 00 00 00 00 00 00 00 00 00 system 024001E0 00 00 00 50 00 00 00 00 00 00 C0 36 00 00 00 00 P ? 024001F0 01 00 00 00 00 00 00 00 64 61 74 61 00 00 00 00 data 02400200 00 00 00 00 00 00 00 00 00 00 C0 4A 01 00 00 00 繨 02400210 00 00 40 87 00 00 00 00 04 00 00 00 00 00 00 00 @? |
Looks like it’s using format below:
1 2 3 4 5 6 7 8 9 10 11 | PartitionTable: 16bytes: [signature] # = 'MPT\x0001.00.00\x00\x00\x00\x00' uint32: [number_of_partitions] array of `PartitionEntry` checksum of partition entries PartitionEntry: 16bytes: [lable] uint64: [size_in_bytes] uint64: [start_off_in_bytes] uint64: [mask] # Defined in DTB. But what is it? |
Found some code about this: Structure definition of partitions
(and mask?), The partition table structure.
I also found (presumbly) a BUG in checksum calculation: The checksum is actually calculated as (uint32)(checksum-of-first-partition * number-of-partitions)
, any partition other than the first one is not taken into consideration. And as such, a simple equation for calculating the checksum would be (uint32)(0xD9115133 * number_of_partitions)
.
I tried to move partition logo
to somewhere more near to the beginning of the eMMC, but seems not work, not sure if the offset is also saved elsewhere.
The partition table itself is in reserved
. Some code whose purpose is unclear is also in it.
The bootloader code starts from the second sector (512 byte) of /dev/mmcblk1
. Which means the first sector is not used. And thus it’s possible to partition /dev/mmcblk1
as MBR, as MBR only uses the first sector to store metadata. As long as the first partition starts after thoes special partitions (bootloader
, reserved
, but nothing else), the system still boots.