我正在编写软件来利用和操作 GUID 分区表 (GPT)。我一直在使用许多参考资料,但在查看有关 GUID 分区表的UEFI 标准文档时,出现了许多问题。
在规范文档的第 121 页上,字段SizeOfPartitionEntry表示它可以取 128 的任何倍数。它给出的公式是 128 * 2^n,其中 n 是等于或大于零的任何整数。问题是,是否有理由使用 128 字节以外的大小,因为那是分区条目的一侧?
在同一页面上,它列出了分区表中的条目数。我的理解是,这始终是 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);
}