FAT32每个目录限制的文件数

我正在尝试在Xillinx Kintex 7卡上用C编码FAT系统。 它配备了MicroBlaze,我已经设法创建了大部分所需的function。

我面临的问题是关于文件夹的总容量,我在网上看到在FAT32中一个文件夹应该能够包含超过65000个文件但是我已经安装了系统我是每个文件夹限制为509个文件。 我认为这是因为我理解了FAT32的工作方式,但这是我迄今为止所做的:

  • 我创建了一个格式化函数,它将正确的数据写入MBR(扇区0)和卷ID(我的磁盘上的扇区2048)。
  • 我创建了一个函数来写入根目录的内容(第一个集群在扇区124 148上开始)
  • 我创建了一个函数来编写一个包含大小为X的N个文件的新文件夹。文件夹的名称写在根目录(扇区124148)中,文件名写在下一个簇(扇区124212,因为我已经将簇大小设置为64个扇区)。 最后,文件的内容(一个简单的计数器)写在从扇区124276开始的下一个簇上。

这里的问题是文件夹的大小为1簇,这意味着它的容量为64扇区= 32KB,我只能在目录中创建512(减2)个文件! 然后,我的问题是:是否可以更改群集数量的文件夹大小? 目前我只使用1个集群,我不明白如何更改它。 它与驱动器的FAT有关吗?

在此先感谢您的帮助!

注意:当我将其插入时,Windows可以识别我的驱动器,我可以访问和读取每个文件(超出510限制的文件除外),我可以通过Windows资源管理器创建新文件。 它显然来自我理解文件创建和文件夹创建的方式!

FAT文件系统中的目录只是一种特殊类型的文件。 因此,对于此“文件”使用更多群集,就像使用任何其他文件一样。

根目录的簇号存储在FAT32头的偏移量0x2c处,通常是簇2 。 如果这是根目录的唯一集群,则集群2的集群映射中的条目包含值0x0FFFFFFF (集群末尾)。 如果将集群映射中的集群3设置为集群2的下一个集群(集群映射中集群2的条目的值为0x00000003 ),则可以将两个集群(例如集群2和3)用于根目录。 现在,集群3可以是最后一个集群(通过将其条目设置为0x0FFFFFFF ),也可以指向另一个集群,以使根目录的空间更大。

这些集群不需要是后续的,但它通常在顺序读取时具有性能提升(这就是为什么对卷进行碎片整理可以大大提高性能的原因)。