首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于GUID划分表规范的混淆

关于GUID划分表规范的混淆
EN

Stack Overflow用户
提问于 2015-05-24 21:27:44
回答 1查看 334关注 0票数 1

我正在编写利用和操作GUID分区表(GPT)的软件。我使用了许多引用,但在查看有关GUID分区表的UEFI标准文件时,出现了许多问题。

  1. 在规范文档的第121页上,字段SizeOfPartitionEntry表示它可以接受128的任意倍数。它给出的公式是128 * 2^n,其中n是等于或大于零的任何整数。问题是,是否有理由使用128字节以外的大小,因为这是分区条目的一侧?
  2. 在同一页上,它列出了分区表中的条目数。据我理解,这个数字总是128。是这种情况,还是数字可以改变?由于规范定义的最大值为128,人们会认为它可以更少吗?

目前,我编写的代码只是将值从磁盘上的打包格式转换为非打包格式,以方便数据访问。此外,我还有一些例程将对GPT的各个方面执行CRC32检查。密码在下面。

代码语言:javascript
运行
复制
/* 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);
  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-24 22:53:07

SizeOfPartitionEntry字段实际上必须是大于或等于128的2的幂。因此,1024是有效的大小,而640 (5 * 128)则不是。假定允许128以外的大小,以便UEFI规范的未来版本可以以兼容的方式扩展分区条目的大小。您的代码应该能够处理任何有效的条目大小。注意,由于规范的早期版本允许任何8的倍数,健壮的实现也应该处理这种情况。

虽然规范确实要求“必须为NumberOfPartitionEntries数组保留至少16,384字节的空间”,但我不知道这或任何其他方面是否对NumberOfPartitionEntries字段设置了任何限制。例如,我认为只要在MyLBA和FirstUsableLBA (以及LastUsableLBA和AlternateLBA之间)之间保留16 if的值,就可以允许4的值,以便在必要时可以扩展该表。无论哪种方式,我都看不到任何能使128个条目达到最大数量的东西。如果SizeOfPartitionEntry大于128个,它也可能小于128个。

值得注意的是,通过快速的网络搜索可以发现NumberOfPartitionEntries设置为12的HP服务器。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30428523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档