2014-11-20 40 views
0

我需要在C中创建自己的文件系统实现。我计划创建类似于FAT系统的系统。我们获得了一个大小为10MB的文件,它充当我们自己的“磁盘”。我知道FAT表存储簇号,根目录存储关于我们创建的每个文件的其他相关信息(例如文件名,大小,上次修改的日期和时间,FAT中的起始块等)。但是我很困惑如何将簇号转换为磁盘上数据区域中的物理地址。内存转换如何在FAT文件系统中工作?

例如,假设根目录中的条目表示文件在FAT表中的块100中开始,并且在FAT表的块100中是整数327,这是文件的下一个簇位于。这些地址如何转换为磁盘数据区域中的物理地址?这些物理地址在哪里翻译和存储?

+0

没有。根目录将有关文件的信息存储在根目录中。 FAT表存储有关您的文件的元数据。起始簇,大小,文件名,等等等等等等。 – 2014-11-20 21:39:31

+0

如果您想模拟该体系结构,则可能需要查找FAT如何工作的旧DOS 3或4时代参考。我同意马克,你不太对。 – 2014-11-20 21:57:43

回答

2

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

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

+0

这个答案与我所能找到的最相似。 FAT表不存储特定于文件的元数据,但仅存储指向链中下一个集群的指针或EOC以指示文件的结尾。从我在其他地方找到的,FAT表中的第i个条目对应于数据区域中的第i个数据块。 感谢您的帮助! – 2014-11-22 16:04:28

+0

很高兴我能够提供帮助。自从我使用扇区编辑器重建分区表和FAT以减少簇大小并通过减少颗粒浪费获得空间 - 这是在30或40兆驱动器上,这已经很长时间了...... – 2014-11-23 12:17:49

+0

@ZeissIkon如何是2^11 = 12位?为什么不是十一? – Mohsin 2016-10-16 08:37:33

1

磁盘被划分成扇区。硬盘例如具有512字节的扇区大小。在磁盘上寻址数据通常使用这些扇区,数据以这种大小的块读/写。 FAT文件系统将多个扇区分组成簇。例如,每个群集可以有8个扇区。此常数与分区前几个扇区中有关文件系统的其他信息一起存储。 FAT驱动程序使用此值从集群编号计算扇区编号。式是这样的:

SectorNumber = SectorsPerCluster *群集号+恒定

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

相关问题