系统中的结构 inode 有块数和块号,但存储中没有相应的数据偏移字节 device.HowFilesystem evenWorks 没有它

struct inode in system has number of blocks & block numbers but no corresponding data offset byte in storage device.HowFilesystem evenWorks without it

我想知道数据是如何存储在存储器中的。所以我所知道的关于一个简单的文件系统组织结构,它包含一个名为 inode 的文件的元数据,它有两个成员字段

结构索引节点{ blkcnt_t i_blocks; ... loff_t i_size; }

我假设 i_blocks 正在存储块号。但是块号是如何编号的?它的类型为 u64

所以问题是如果这个字段包含所有块 [数字] 那么它们是如何存储的 u64 表示 64 位,如果我表示每个 4 位与块号相关,那么每个 inode 有 16 个块。例如,如果 i_blocks 字段是 0b1111 1110....,那么 1111 是块号 15,1110 是块号 14,依此类推。所以我想知道表示块号的位数是否为 4 位然后 inode 中只能有 15 个块所以这样我有块号和块数但我仍然无法填写第三个字段 >> > 数据块的基地址是什么,例如,如果 inode 号是 1111,对应于 some.txt 文本文件和数据 hello world 那么 hello world 数据在存储设备中的偏移量在哪里。我找不到相应 inode 编号的数据偏移字段数组。谁能告诉我在哪里可以找到存储介质中的数据偏移字节并且它必须在 inode 结构中的答案?

查找 inode 编号的简图 ii:

  • 找到 block ii 所在的 inode block: ii/InodesPerBlock;使用它作为 inodeblocks 的索引。
  • 在这个块中找到 index : ii%InodesPerBlock
  • 把(cast)这个位置当作一个inode,把blocks[]数组中的第一个条目作为number第一个数据块。

要查找 文件,此操作必须先于查找 目录 条目和查找文件的 inode编号

注意:有很多manifest常量,这些都可以在superblock

中找到
  • 大小
  • 文件系统类型
  • 块大小
  • 索引节点块数(或:索引节点数)
  • inode 的大小(或:InodesPerBlock)
  • 数据块数
  • 包含 root 目录的 inode 的位置
  • freelist 包含未使用块号的位置
  • State/backup/...
  • 等等...

注意 2:这是一个 简化的 方案。现代文件系统可能包含额外的结构以提高效率或冗余。另外:一个文件系统可以将多个 physical 块组合成一个 logical 块(例如 8*512 -->> 4096)

注意 3:superblock 位于 blocknumber=0(至少在 UFS 中)这意味着 0 可以用作 blocknumbers 的标记值,指的是 actual (非根)块。因此,inodes 中的 blocknumber 数组可以初始化为全零。

注意4:这些结构都驻留在磁盘上。内核可能会在内存中维护(它会!)额外的类似结构。这些结构将引用它们自身(使用指针、偏移量或索引)或者它们将引用磁盘块(数字)。