Extensible Firmware Interface Specification 1.10, раздел 11.2.2, страница 367.
UEFI Specification Version 2.3, раздел 5 “GUID Partition Table (GPT) Format”, страница 91.
В нулевом блоке на диске находится Protective MBR. В следующем же – GUID Partition Table Header. Это структура, описывающая различные данные по диску, включая GUID для уникальной идентификации диска, адрес стартового блока массива записей о разделах, размер записи в этом массиве и т.д.
Формат описан в таблице:
Mnemonic
Byte
Length
Description
Signature
0
8
Identifies EFI-compatible partition table header. This value must contain the string “EFI PART,” 0×5452415020494645.
Revision
8
4
The revision number for this header. This revision value is not related to the UEFI Specification version. This header is version 1.0, so the correct value is 0×00010000.
HeaderSize
12
4
Size in bytes of the GUID Partition Table Header. The HeaderSize must be greater than 92 and must be less than or equal to the logical block size.
HeaderCRC32
16
4
CRC32 checksum for the GUID Partition Table Header structure. This value is computed by setting this field to 0, and computing the 32-bit CRC for HeaderSize bytes.
Reserved
20
4
Must be zero.
MyLBA
24
8
The LBA that contains this data structure.
AlternateLBA
32
8
LBA address of the alternate GUID Partition Table Header.
FirstUsableLBA
40
8
The first usable logical block that may be used by a partition described by a GUID Partition Entry.
LastUsableLBA
48
8
The last usable logical block that may be used by a partition described by a GUID Partition Entry.
DiskGUID
56
16
GUID that can be used to uniquely identify the disk.
PartitionEntryLBA
72
8
The starting LBA of the GUID Partition Entry array.
NumberOfPartitionEntries
80
4
The number of Partition Entries in the GUID Partition Entry array.
SizeOfPartitionEntry
84
4
The size, in bytes, of each the GUID Partition Entry structures in the GUID Partition Entry array. Must be a multiple of 8.
PartitionEntryArrayCRC32
88
4
The CRC32 of the GUID Partition Entry array. Starts at PartitionEntryLBA and is computed over a byte length of NumberOfPartitionEntries * SizeOfPartitionEntry.
Reserved
92
BlockSize – 92
The rest of the block is reserved by UEFI and must be zero.
За время, прошедшее с прошлой статьи о GPT, диск, на котором я ставил эксперименты, успел уйти под другие задачи, поэтому продолжим на флеш-драйве 8GB с GUID, разбитом на два раздела:
Напомню, что BlockSize не обязательно 512, его можно узнать для каждого конкретного случая через вызов ioctl с селектором DKIOCGETBLOCKSIZE - программу я привёл в статье "Получение информации по диску через ioctl". На нашем диске BlockSize=512.
16-19 (0x10-0x13) 4 байт. HeaderCRC32. 9b 3c cb 8f. Для того, чтобы вычислить CRC32, в это поле записываются нули, после чего CRC32 считается для блока размером HeaderSize, т.е. для 92 байт.
Для вычисления CRC32 я воспользовался кодом на C. Пожалуй, отдельно напишу программу для разбора GPT, сейчас же воспользуюсь скомпилированным кодом и Hex Fiend для "обнуления".
40-47 (0x28-0x2F) 8 байт. FirstUsableLBA. 22 00 00 00 00 00 00 00 = 0x22. Посмотрите, как вычисляется размер массива Partition Entry в описании поля SizeOfPartitionEntry. Первый блок на диске занят под Protective MBR, второй - под Partition Entry Header, затем в 0x20 блоках находится Partition Entry Array, т.е. занято 0x22 блока. Адресация блоков начинается с нуля, значит разделы можно располагать на диске, начиная с блока 0x22.
48-55 (0x30-0x37) 8 байт. LastUsableLBA. de 5f ef 00 00 00 00 00 = 0xEF5FDE = 15687646. Последний блок, который можно использовать под разделы.
Давайте посмотрим причину. Размер диска посмотрим в diskutil:
Alternate Partition Table Header находится в последнем блоке на диске, нумерация с нуля, т.е. она находится в блоке (TotalDiskSize - 1) = 0xEF6000 - 1 = 0xEF5FFF. Так и есть, этот адрес мы видели в поле AlternateLBA.
Перед Alternate Partition Table Header располагается копия Partition Entry Array размером 0x20 (смотрите комментарий к SizeOfPartitionEntry). 0xEF5FFF - 0x20 = 0xEF5FDF. Т.е. Partition Entry Array начинается с блока 0xEF5FDF, а последний блок, доступный для разделов, является 0xEF5FDE, и это значение мы видели в поле LastUsableLBA.
56-71 (0x38-0x47) 16 байт. DiskGUID. 0d 70 a7 c1 50 34 a3 40 99 45 46 0a 87 cf 8c 9a. К сожалению, пока я не нашёл, как генерируется это поле.
72-79 (0x48-0x4F) 8 байт. PartitionEntryLBA. 02 00 00 00 00 00 00 00 = 2. Массив GUID Partition Entry начинается со второго блока диска.
80-83 (0x50-0x53) 4 байт. NumberOfPartitionEntries. 80 00 00 00 = 0x80 = 128. Это максимальное количество разделов на диске.
84-87 (0x54-0x57) 4 байт. SizeOfPartitionEntry. 80 00 00 00 = 0x80 = 128 байт. Размер каждой записи Partition Entry равен 128 байт. Имея размер массива разделов и размер записи, получаем размер массива. 0x80 x 0x80 = 0x4000 = 16384 байт = 32 блока = 0x20
А не могли бы Вы разъяснить, для чего создается раздел " EFI 209.7 MB"?
Собственно, для того, что бы не терять эти 0,2 Gb я разбиваю внешние диски старой схемой разделов Apple.
Также было довольно интересно узнать из ваших статей, что оказывается на интеле (до 10.6) можно и с этой старой схемой разделов загружаться, не обязательно использовать GUID, хотя в подсказке в Дисковой утилите написано обратное.
Андрец
А не могли бы Вы разъяснить, для чего создается раздел " EFI 209.7 MB"?
Собственно, для того, что бы не терять эти 0,2 Gb я разбиваю внешние диски старой схемой разделов Apple.
Также было довольно интересно узнать из ваших статей, что оказывается на интеле (до 10.6) можно и с этой старой схемой разделов загружаться, не обязательно использовать GUID, хотя в подсказке в Дисковой утилите написано обратное.
Андрей
Для меня минус в GUID как раз в этой потере 200 мегабайт места, хотя из Ваших статей я понял, что Apple Partition Map устаревшая схема разбивки.
Спасибо за статьи, кстати.
Андрей
Для меня минус в GUID как раз в этой потере 200 мегабайт места, хотя из Ваших статей я понял, что Apple Partition Map устаревшая схема разбивки.
Спасибо за статьи, кстати.
http://intensedebate.com/people/ctrld ctrld
В EFI находится собственно EFI (bootloader). Без него диск не будет загрузочным, но для данных это неважно. Через DiskUtil вряд ли удастся что-то сделать.
Я буду после рассмотрения GUID Partition Array заниматься разделами EFI/HFS, там посмотрю, как можно удалить EFI.
http://intensedebate.com/people/ctrld ctrld
В EFI находится собственно EFI (bootloader). Без него диск не будет загрузочным, но для данных это неважно. Через DiskUtil вряд ли удастся что-то сделать.
Я буду после рассмотрения GUID Partition Array заниматься разделами EFI/HFS, там посмотрю, как можно удалить EFI.