我正在尝试在RPI 3B上编写裸机FAT32文件系统驱动程序。 我可以使用emmc驱动程序读取FAT扇区和根目录扇区。
当下一个条目指针(下一个簇号)不适合当前FAT扇区时,我对如何遵循FAT条目链接列表存有疑问? 每次获得新的群集号时,我都应该读取FAT扇区吗?
我目前的理解如下: 获取目录/文件的第一个群集号(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中下一个条目的索引,考虑到32个胖条目跨越4个字节,我是否需要将其乘以4。 如果有人可以澄清一下,那将有所帮助。预先感谢。
答案 0 :(得分:2)
实现FAT的缓存(在RAM中)。假设高速缓存具有足够的RAM来容纳20个扇区,并且开始为空。
接下来编写一个“ getFATentry”函数,该函数检查扇区是否在高速缓存中,并在高速缓存中找到正确的条目;或(如有必要)从缓存中逐出某些东西以腾出空间,从磁盘中将正确的扇区提取到缓存中,然后在缓存中找到正确的条目。
完成此操作后,您可以next_cluster = getFATentry(previous_cluster);
,而不必担心缓存或任何磁盘IO(但在修改FAT时将想做一些事情-例如采用“直写”或“回写”策略)。
注意:通过调整“ FAT缓存”的大小,可以提高性能或减少RAM消耗。允许缓存动态增长/缩小是很好的(例如,如果没有其他东西需要RAM,则增长到整个FAT,但是如果其他东西需要所有RAM,则缩小到最小)。
答案 1 :(得分:0)
我找到了解决方法。
首先读取给定簇号的初始胖扇区。
找出thisFatEntryOffset并读取下一个胖条目。
新的胖条目将是新的群集编号。找出thisFatNumber和thisFatEntryOffset以获取新的群集号。
如果新的脂肪区段!=旧的脂肪区段,则读取新的脂肪区段并使用thisFatEntryOffset读取条目。