文件系统如何从字节/位识别“文件”?

文件系统如何从字节/位识别“文件”?

不确定是否偏离主题,但我相信文件系统的工作是识别位/字节块并将它们称为“文件”,以便更方便地访问数据,并将其打包成一个单元,而不是无序的触发器状态海洋。但这或多或少是如何做到的?文件系统(任何有问题的文件系统)是否映射或保留数据开始/数据结束之间的偏移量的引用,它是否使用已检查地址的标识符等?我有编程知识,但这个低级概念肯定让我感到困惑。我知道大多数文件系统都是用 HLL(如 C、C++、D 等)编写的,但它们究竟如何在最低级别上完美地跟踪从文件“A”的扇区/块 1 到最后一个范围的所有内容?

答案1

硬盘以 512 或 4k 字节的数据簇为单位排列,每个簇称为一个块。

在最低级别,操作系统将发出命令,例如从块 4 读取或写入块 11。SATA 规范明确定义了这些命令的工作方式以及应提供哪些命令。这些低级命令被抽象为文件系统与之交互的高级命令。

文件系统提供文件到磁盘块的映射。一个非常基本的文件系统(如 MS-DOS FS)首先会有一个分区表(位于块 0,即“超级块”),它允许您在物理磁盘之上定义逻辑磁盘。然后,每个逻辑磁盘都会以一个定义目录的条目开始。这些目录条目中的每一个都会包含一个文件列表以及指向该文件的块。

对于每个文件,第一个块将是一个元数据结构,它定义文件是什么(文件,目录,链接或其他内容),文件有多大,访问权限是什么,以及文件数据所在的块列表。

答案2

文件系统没有认出文件。相反,它们定义了

从空磁盘开始,并要求文件系统在那里创建一个文件。它将:

  1. 确定文件名和/或路径语法是否正确
  2. 确定文件在目录结构中的逻辑位置
  3. 确定该位置是否已存在另一个同名文件,如果是,则是否覆盖它、附加到它或返回错误。
  4. 在文件系统元数据中创建一个或多个条目,表明该文件存在于所需的父目录中
  5. 为组成文件的字节分配磁盘空间
  6. 将文件的字节写入分配的磁盘空间
  7. 更改元数据以指示文件所有块的位置,并说明 EOF 的位置(如果它是连续文件)。

除了最初创建的相同数据结构之外,所有这些都不需要文件系统“识别”任何东西。

相关内容