C语言 在 FAT 文件系统中内存转换如何工作



我需要用C语言创建自己的文件系统实现。我计划创建一个类似于FAT系统的系统。我们得到了一个大小为 10MB 的文件,它充当我们自己的"磁盘"。我知道 FAT 表存储集群编号,根目录存储有关我们创建的每个文件的其他相关信息(例如文件名、大小、上次修改日期和时间、FAT 中的开始块等)。但我对如何将集群编号转换为磁盘上数据区域中的物理地址感到困惑。

例如,假设根目录中的条目说文件从 FAT 表中的块 100 开始,而在 FAT 表的第 100 块中是整数 327,这是文件的下一个集群所在的位置。如何将这些地址转换为磁盘数据区域中的物理地址?这些物理地址在哪里转换和存储?

不同版本的 FAT (FAT12、FAT16 和 FAT32)之间的簇大小不同,但通常,簇号指向一个连续编号的簇,无论其大小如何,都存在于现有文件系统的格式中。 我记得(很久以前)FAT12,至少在硬盘上,使用了 2 个 kibibyte 簇(每个簇由四个 512 字节扇区组成),最大簇数为 2^11(12 位从零开始),因此簇 327 将是 327 * 2048 字节从磁盘的数据区域开始

数据区域包括 FAT、备份 FAT 和所有目录。 我记得 FAT 中的每个集群条目都包含一个指向文件中占用该集群的下一个集群的指针、数据长度(如果它是文件的最后一个集群)以及读取或写入文件所需的一些其他信息,而目录条目包含文件名,第一个集群, 尺寸/日期/等

磁盘分为扇区。例如,硬盘的扇区大小为 512 字节。对磁盘上的数据进行寻址通常使用这些扇区,并且数据在此大小的块中读取/写入。FAT 文件系统将多个扇区分组到集群中。例如,每个集群可以有 8 个扇区。此常量与有关文件系统的其他信息一起存储在分区的前几个扇区中。FAT 驱动程序使用此值根据群集编号计算扇区编号。公式如下所示:

扇区数 = 扇区每个群集 * 群集数 + 常量

常量是分区数据区域的第一个扇区的扇区号。您可以在FAT规范中找到确切的公式。

最新更新