关于 GUID 分区 Table 规范的困惑
Confusion about GUID Partition Table specification
我正在编写软件来利用和操作 GUID 分区表 (GPT)。我一直在使用大量参考资料,但在查看有关 GUID 分区表的 UEFI standards document 时,出现了一些问题。
规范文档第121页,字段SizeOfPartitionEntry说可以取128的任意倍数,它给出的公式是128 * 2 ^n 其中 n 是等于或大于零的任何整数。问题是,是否有理由使用 128 字节以外的大小,因为这是分区条目的一侧?
在同一页上,它列出了分区 table 中的条目数。我的理解是,这始终是 128。是这种情况还是数字可以更改?由于规范定义的最大值为 128,人们会认为它可以更小吗?
目前,我编写的代码只是将值从磁盘上的打包格式转换为非打包格式,以方便数据访问。此外,我还有一些例程可以对 GPT 的各个方面执行 CRC32 检查。该代码如下。
/* 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);
}
SizeOfPartitionEntry 字段实际上必须是大于或等于 128 的 2 的幂。因此 1024 是有效大小,但 640 (5 * 128) 不是。假设 128 以外的大小是允许的,以便 UEFI 规范的未来版本可以以兼容的方式扩展分区条目的大小。您的代码应该能够处理任何有效的条目大小。请注意,由于规范的先前版本允许 8 的任何倍数,因此稳健的实现也应该处理这种情况。
虽然规范确实要求“至少 16,384
space 的字节必须为 GPT 分区条目数组保留”,我不知道这个或其他任何东西是否对 NumberOfPartitionEntries 字段有任何限制。我认为,对于例如,只要在 MyLBA 和 FirstUsableLBA 之间(以及 LastUsableLBA 和 AlternateLBA) 以便在必要时可以扩展 table。无论哪种方式,我都看不到任何使 128 成为最大条目数的东西。它也可以如果 SizeOfPartitionEntry 大于 128,则小于 128。
对于它的价值,快速网络搜索显示 NumberOfPartitionEntries 设置为 12 的 HP Itanium 服务器。
我正在编写软件来利用和操作 GUID 分区表 (GPT)。我一直在使用大量参考资料,但在查看有关 GUID 分区表的 UEFI standards document 时,出现了一些问题。
规范文档第121页,字段SizeOfPartitionEntry说可以取128的任意倍数,它给出的公式是128 * 2 ^n 其中 n 是等于或大于零的任何整数。问题是,是否有理由使用 128 字节以外的大小,因为这是分区条目的一侧?
在同一页上,它列出了分区 table 中的条目数。我的理解是,这始终是 128。是这种情况还是数字可以更改?由于规范定义的最大值为 128,人们会认为它可以更小吗?
目前,我编写的代码只是将值从磁盘上的打包格式转换为非打包格式,以方便数据访问。此外,我还有一些例程可以对 GPT 的各个方面执行 CRC32 检查。该代码如下。
/* 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);
}
SizeOfPartitionEntry 字段实际上必须是大于或等于 128 的 2 的幂。因此 1024 是有效大小,但 640 (5 * 128) 不是。假设 128 以外的大小是允许的,以便 UEFI 规范的未来版本可以以兼容的方式扩展分区条目的大小。您的代码应该能够处理任何有效的条目大小。请注意,由于规范的先前版本允许 8 的任何倍数,因此稳健的实现也应该处理这种情况。
虽然规范确实要求“至少 16,384 space 的字节必须为 GPT 分区条目数组保留”,我不知道这个或其他任何东西是否对 NumberOfPartitionEntries 字段有任何限制。我认为,对于例如,只要在 MyLBA 和 FirstUsableLBA 之间(以及 LastUsableLBA 和 AlternateLBA) 以便在必要时可以扩展 table。无论哪种方式,我都看不到任何使 128 成为最大条目数的东西。它也可以如果 SizeOfPartitionEntry 大于 128,则小于 128。
对于它的价值,快速网络搜索显示 NumberOfPartitionEntries 设置为 12 的 HP Itanium 服务器。