内存转换如何在FAT文件系统中工作?

时间:2014-11-20 21:35:25

标签: c filesystems fat32

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

SectorNumber = SectorsPerCluster * ClusterNumber + Constant

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