我正在学习一些有关 Ext4 文件系统的知识这里。在此链接的第一个表中,它们描述了索引节点的字段。每个字段条目都有一个:
抵消
尺寸
姓名
描述
在描述字段中,文档指出其中一些值是低位或高位。低/高位是什么意思,以及在此 ext4 文件系统示例中使用该概念背后的解释是什么?
答案1
让我们举一个例子,使用文档您在问题中链接到以供参考:该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 位存储在磁盘上的两个位置:不是相邻:第一个位于距 inode 开头的偏移量 0x2 处,但第二个位于距 inode 开头的偏移量 0x74 + 0x4 处:0x74 是 12 字节字段开始的位置,0x4 是fromi_osd2
的偏移量领域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 文件系统,而用户无需执行任何特殊操作)以及适应未来扩展的愿望。有了 20/20 的后见之明,所有分散的部分都可以放在一起,您会看到例如一个i_uid
类型__le32
,而不必将其分成两部分。但这就是你必须做的事情,才能继续前进,而不放弃以前发生的一切。