读取FAT32目录内容

Reading directory contents in FAT32

我正在尝试在 RPI 3B 上编写裸机 FAT32 文件系统驱动程序。 我可以使用emmc 驱动程序读取FAT 扇区和根目录扇区。

我有疑问,当下一个入口指针(下一个簇号)不适合当前FAT扇区时,如何跟踪FAT入口链表? 每次到新的簇号都要读FAT扇区吗?

我目前的理解是这样的: 获取 directory/file 的第一个簇号 (cluster_number) 读取包含 first_cluster_number 条目的 FAT 扇区。 假设我将 FAT 扇区读为

uint8_t fat_sector[512] = { 0 };
uint32_t this_fat_sector_num, this_fat_entry_offset;
this_fat_sector_num =  unusedSectors + reservedSectorCount + ((cluster_number * 4)/ bytesPerSector);
this_fat_entry_offset =  (cluster_number * 4)/ bytesPerSector;
read_fat_sector(this_fat_sector_num, & fat_sector[0]);
// Calculate next cluster in chain
uint32_t next_cluster_number = ((uint32_t * fat_sector[this_fat_entry_offset])) & 0x0fffffff;
// Calculate next cluster in chain 1 more time, is below code correct ?
 uint32_t next_next_cluster_number = ((uint32_t * fat_sector[next_cluster_number])) & 0x0fffffff;

如果已读取的 fat_sector 缓冲区(512 字节)中不存在下一个簇号,会发生什么情况? 如果簇号 = fat_sector 中下一个条目的索引,我是否需要将它乘以 4,因为 fat 32 条目跨越 4 个字节。 如果有人能给出一些清晰度,那将很有帮助。提前致谢。

我找到了解决方案。

首先读取给定簇号的初始胖扇区。

找出这个FatEntryOffset,读取下一个fat entry。

新的fat条目将是新的簇号。找出新簇号的 thisFatNumber 和 thisFatEntryOffset。

如果新胖扇区 != 旧胖扇区则读取新胖扇区并使用 thisFatEntryOffset 读取条目。

实现 FAT 缓存(在 RAM 中)。假设缓存有足够的 RAM 用于 20 个扇区并且开始时是空的。

接下来编写一个"getFATentry"函数,检查该扇区是否在缓存中,如果是,则在缓存中找到正确的条目;或(如有必要)从缓存中逐出某些内容以腾出空间,从磁盘中提取正确的扇区到缓存中,然后在缓存中找到正确的条目。

一旦完成,您就可以 next_cluster = getFATentry(previous_cluster); 而不必担心缓存或任何磁盘 IO(但在修改 FAT 时需要做一些事情 - 例如采用 "write-through" 或 "write-back"政策)。

注意:通过调整 "FAT cache" 的大小,您可以提高性能或减少 RAM 消耗。允许缓存动态 grow/shrink 会很好(例如,如果没有其他需要 RAM,则增长到与整个 FAT 一样大,但如果所有 RAM 都需要其他东西,则缩小到最低限度)。