Путаница в спецификации таблицы разделов GUID
Я пишу программное обеспечение для использования и управления таблицами разделов GUID (GPT). Я использовал несколько ссылок, но при просмотре документа стандартов UEFI, касающихся таблиц разделов GUID, возник ряд вопросов.
На странице 121 документа спецификации поле SizeOfPartitionEntry говорит, что оно может принимать любое кратное 128. Формула, которую он дает, равна 128 * 2^n, где n - любое целое число, равное или большее нуля. Вопрос в том, есть ли причина использовать размер, отличный от 128 байт, так как это сторона записи раздела?
На той же странице он перечисляет количество записей в таблице разделов. Насколько я понимаю, это всегда 128. Это так или может измениться число? Поскольку максимальное значение, определенное в спецификации, равно 128, можно предположить, что оно может быть меньше?
В настоящее время код, который я написал, состоит в том, чтобы просто преобразовать значения из упакованного формата на диске в неупакованный формат, чтобы облегчить доступ к данным. Кроме того, у меня есть подпрограммы, которые будут выполнять проверки CRC32 и по аспектам GPT. Этот код ниже.
/* Validates the GPT entries. */
int fs_gptp_gptevalid(fs_gptent_t *list, fs_gpt_t *head)
{
uint32 ls; /* List Size */
uint32 crc; /* List CRC */
ls = head->entry_count * head->entry_size;
crc = fs_gptp_crc32(list, ls);
if (crc != head->p_crc32) return(0);
return(1);
}
/* Validates the GPT header. */
int fs_gptp_gpthvalid(fs_gpt_t *head)
{
uint32 hs; /* Header Size */
uint32 crc1, crc2; /* Header CRCs */
/* According to the specification, the header CRC field
needs to be zero when calculating the CRC. */
hs = head->hsize;
crc1 = head->h_crc32;
head->h_crc32 = 0;
crc2 = fs_gptp_crc32(head, hs);
head->h_crc32 = crc1;
if (crc1 != crc2) return(0);
return(1);
}
1 ответ
Поле SizeOfPartitionEntry на самом деле должно быть степенью 2 больше или равно 128. Таким образом, 1024 является допустимым размером, а 640 (5 * 128) - нет. Предположительно, допустимы размеры, отличные от 128, чтобы будущая версия спецификации UEFI могла совместимым образом увеличить размер записи раздела. Ваш код должен обрабатывать любой допустимый размер записи. Обратите внимание, что, поскольку предыдущие версии спецификации допускали любое кратное 8, надежная реализация должна также обрабатывать этот случай.
Хотя спецификация требует, чтобы "для массива записи раздела GPT было зарезервировано не менее 16 384 байт пространства", я не знаю, накладывает ли это или что-либо еще какие-либо ограничения на поле NumberOfPartitionEntries. Я думаю, например, что значение 4 будет разрешено, если 16Kb зарезервировано между MyLBA и FirstUsableLBA (и между LastUsableLBA и AlternateLBA), так что таблица может быть расширена при необходимости. В любом случае я не вижу ничего, что делает максимальное количество записей 128. Также может быть меньше 128, если SizeOfPartitionEntry больше 128.
Что бы это ни стоило, быстрый веб-поиск показывает серверы HP Itanium с NumberOfPartitionEntries, установленным в 12.