所以我正在对 EXT4 校验和进行一些研究。
我发现这一页并尝试自己计算校验和。我从超级块开始,因为它听起来很简单:“整个超级块直到校验和字段”。
但它不起作用:我无法得到与超级块相同的结果。
为了这个任务,我用 Python 编写了超级块校验和计算器。你可以看看我在 GitHub 上的程序。我尝试了很多事情。
首先,我尝试读取整个超级块直到校验和(1020字节)并将其放入CRC32C中(算法是独立于 pip 的库)。虽然这是在wiki上写的,但这不起作用。
然后我简单地反转了整个超级块。我认为这没有多大意义。而我又失败了。
之后,我尝试了更复杂的方法。我尝试分别反转超级块的所有字段。正如您所看到的,它给出了另一个结果:
Raw data: 1F DC 5E 4A
2-byte fields reversed: DC 1F 4A 5E
Full data reverse: 4A 5E DC 1F
我再一次失败了。至此,短语“直到校验和字段的整个超级块”的所有解释结束。
我尝试向所有算法添加零填充校验和字段,并尝试仅反转小端字段(实际上似乎是个好主意),而不反转 char 和 u8 字段。
但没有机会获得与原始超级块相同的校验和。
我的脚本为超级块生成如下输出:
00c0390000cae600198a0b00c6aca40039a835000000000002000000020000000080000000800000002000001ee68c5c17e68c5c2000ffff53ef01000100000055936d5c000000000000000001000000000000000b000000000100003c000000c60200006b040000d6eb1a5613a44a8a91b66dbfe7cbbca9000000000000000000000000000000002f0061726765740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000800000000000000f00c3000ca7d5363a49944fd9db16c0f95cfab15010140000c0000000000000055936d5c0af3020004000000000000000000000000800000008070000080000000800000000071000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000200020000100000000000000000000000000000000000000040100000d63df0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fe3731ed
原始校验和(未计算!):0xfe3731ed
计算出的整个超级块:0xffffffffL - 这种情况总是会发生,可能会出现一些溢出错误。
没有校验和的计算超级块:0x12cec801L
没有校验和的计算完全反转超级块:0x7fe225e5L
计算字段反转超级块:0x8cce5045L
我找不到任何文档,而且 ext4 源代码文件的注释很差(而且非常复杂),我无法理解它们。
答案1
好的。我从 Reddit (nightbladeofmalice) 得到了答案。这个人注意到,如果从 0xFFFFFFFF 中减去原始超级块的校验和(0x12cec801),则会给出反转的(大端)原始校验和:
原始超级块:
原始校验和(未计算,大端!):0xf37cde15
CRC32C 中没有校验和字段的原始超级块(1020 字节):0xc8321eaL
反转校验和(0xFFFFFFFF-前一个字段):0xf37cde15L