我在这里学习了一些关于 Ext4 文件系统的知识。在此链接的第一个表中,他们描述了 inode 的字段。每个字段条目都有一个:
抵消
尺寸
姓名
描述
在描述字段中,文档指出其中一些值是低位或高位。低位/高位是什么意思,在这个 ext4 文件系统示例中使用这个概念背后的解释是什么?
我在这里学习了一些关于 Ext4 文件系统的知识。在此链接的第一个表中,他们描述了 inode 的字段。每个字段条目都有一个:
抵消
尺寸
姓名
描述
在描述字段中,文档指出其中一些值是低位或高位。低位/高位是什么意思,在这个 ext4 文件系统示例中使用这个概念背后的解释是什么?
让我们举一个例子,使用您在问题中链接到的文档
i_uid
作为参考:该字段具有大小__le16
并被描述为Lower 16-bits of Owner UID
. 如果创建此文件系统的系统仅允许 16 位用户 ID,则所有用户 ID 都可以放入该i_uid
字段:__le16
确实代表“little-endian 16 位”。在你的类比中,如果你只能有两位数并且成本是 29 美元,那么你就已经准备好了,因为它很合适。如果它使用 32 位用户 ID(我很确定没有系统使用更大的用户 ID),那么 32 位用户 ID 将不适合 size 的字段
__le16
,因此 32 位被分成两个 16 位数量。如果我们将位从 0 (最低有效位)编号到 31(最高有效位)(这只是我们在这里使事情明确的惯例),那么位 0-15(“低位”位)将被放入该i_uid
字段,但第 16-31 位(“高阶”位)不适合,必须转到其他位置:在使用 32 位用户 ID 的 Linux 上,它们最终位于inode 字段的子字段中l_i_uid_high
。osd2
在你的类比中,如果成本是 129 美元但你有两位数的盒子,那么29
将适合低位的两位数框,并01
会进入高位的两位数框。补充几点:请注意,所有字段都是“小端” - 如果字段包含多个字节(例如
__le16
包含两个字节),则最不重要的字节首先出现,最重要的字节出现排在第二位,但它们是相邻的。这与系统 CPU 的字节顺序无关:这样,文件系统在磁盘上的布局方式与布局它的 CPU 无关;如果需要,您可以在具有相反字节序的不同系统上读取此文件系统(需要注意的是,在两个系统上运行的 ext4 版本应该兼容)。另请注意,用户 ID 的低 16 位(= 2 个字节)和用户 ID 的高 16 位存储在磁盘上不相邻的两个位置:第一个位置在偏移量 0x2 处inode 的开头,但第二个是 inode 开头的偏移量 0x74 + 0x4:0x74 是 12 字节
i_osd2
字段的开始位置,0x4 是l_i_uid_high
从字段开头的偏移量i_osd2
。这可能是因为在某些时候,“全世界都是 16 位用户 ID”,所以早期的文件系统只为用户 ID 保留第一个字段。当需要使用 32 位用户 ID 时,第二个 16 位不能相邻放置,因为其他字段已经存在(在这种情况下i_size
字段,最初限制为 32 位,但事实证明太小了,所以最终i_size_field
添加了 an 以获得另外 32 位的大小 - 请参阅 inode 中的偏移量 0x6C),因此它被放置在(可能)第一个位置在未使用且可供使用的 inode 中。许多这种复杂性是出于向后兼容性考虑(ext4 希望能够读取 ext3 文件系统而用户无需执行任何特殊操作)和适应未来扩展的愿望所必需的。事后看来,所有分散的部分都可以放在一起,您会看到例如一个
i_uid
类型__le32
,而不是必须将其分成两部分。但这就是你必须做的事情,才能在不放弃以前的一切的情况下继续前进。