Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 关于GUID分区表规范的混淆_C_Guid_Disk Partitioning_Guid Partition Table - Fatal编程技术网

C 关于GUID分区表规范的混淆

C 关于GUID分区表规范的混淆,c,guid,disk-partitioning,guid-partition-table,C,Guid,Disk Partitioning,Guid Partition Table,我正在编写利用和操作GUID分区表(GPT)的软件。我已经使用了很多参考资料,但是在查看有关的GUID分区表时,出现了一些问题 在规范文档的第121页,SizeOffPartitionEntry字段表示它可以采用128的任意倍数。它给出的公式是128*2^n,其中n是等于或大于零的任何整数。问题是,是否有理由使用128字节以外的大小,因为这是分区条目的一侧 在同一页上,它列出了分区表中的条目数。我的理解是这总是128。是这样还是号码可以改变?由于规范定义的最大值为128,因此可以假设它可以更小

我正在编写利用和操作GUID分区表(GPT)的软件。我已经使用了很多参考资料,但是在查看有关的GUID分区表时,出现了一些问题

  • 在规范文档的第121页,SizeOffPartitionEntry字段表示它可以采用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);
      }
    
    SizeOffPartitionEntry字段实际上必须是大于或等于128的2的幂。所以1024是有效的大小,但640(5*128)不是。假定允许128以外的大小,以便UEFI规范的未来版本能够以兼容的方式扩展分区条目的大小。您的代码应该能够处理任何有效的条目大小。请注意,由于规范的早期版本允许8的任意倍数,因此健壮的实现也应该处理这种情况

    而本规范要求“至少为16384 必须为GPT分区条目数组保留字节的空间”,我不知道这是否对NumberOfPartitionEntries字段有任何限制。例如,我认为,只要在MyLBA和FirstUsableLBA之间(以及LastUsableLBA和AlternateLBA之间)保留16Kb的空间,就允许使用4的值,以便在必要时扩展表。无论哪种方式,我都看不到任何使128成为最大条目数的东西。如果SizeOfPartitionEntry大于128,则它也可能小于128


    值得一提的是,快速的网络搜索会显示NumberOfPartitionEntries设置为12的HP Itanium服务器。

    这是一个很好的答案,回答了我的问题。在SizeOfPartitionEntry的情况下,只要最小值是128,我就使用它所说的任何内容。该规范规定最大值为128,但如果是32位无符号整数,则可以有40亿。所以我将使用最大值128,并使用最大值为128的任何尺寸。@DanielRudy你能指出最大值是128吗?我看不到。我在说明书中也没有看到,但我知道我在什么地方读过。此外,由于最小保留大小为16384字节,每个条目为128字节,因此16384/128=128。是的,但最小保留大小只会在数字条目上放置一个最小大小。所以它不能阻止它大于128。这只能防止它小于128,但我认为事实并非如此。我提到的HP安腾服务器只有12个条目,但仍然为表保留了至少16384字节(有时更多)。我看到了您关于HP安腾服务器有12个条目的宣传。据我所知,实际上没有限制,因为表大小的唯一要求是最小16k。然而,我怀疑拥有10亿个条目是否切实可行,因为这将保留128GB的容量,这将是一个相当好的硬盘百分比。用一个无符号的32位整数,你可以得到40亿,这是愚蠢的。我确实认为需要4个以上的分区,但我想不出任何情况下需要超过…32个分区,即使安装了2个版本的windows和linux或freebsd。