我试图在RPI3B上编写裸金属FAT32文件系统驱动程序。我能够使用emmc驱动程序读取FAT扇区和根目录扇区。
当下一个条目指针(下一个集群号)不适合当前FAT扇区时,我怀疑如何跟踪FAT条目链接列表?每次到达新的群集号时,我是否应该阅读胖扇区?
我目前的理解如下:获取目录/文件的第一个集群号(cluster_number),读取包含first_cluster_number条目的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中下一个条目的索引,那么考虑到fat 32项跨越4个字节,是否需要将其乘以4。如果有人能说清楚的话,那会有帮助的。提前谢谢。
发布于 2019-05-14 09:55:55
实现FAT的缓存(在RAM中)。假设缓存有足够的RAM用于20个扇区,并且开始为空。
接下来,编写一个"getFATentry“函数,检查扇区是否在缓存中,并在缓存中找到正确的条目(如果是);或者(如果必要的话)从缓存中取出一些东西以腾出空间,将正确的扇区从磁盘取到缓存中,然后在缓存中找到正确的条目。
一旦完成,您就可以在不担心缓存或任何磁盘IO的情况下next_cluster = getFATentry(previous_cluster); (但是当FAT被修改时,您会想要做一些事情--例如,采用“写-通”或“写-回”策略)。
注意:通过调整"FAT缓存“的大小,可以提高性能或减少RAM消耗。最好允许缓存动态地增长/收缩(例如,如果不需要RAM,则增长到与整个FAT一样大,但是如果其他东西需要所有RAM,则缩小到最小)。
发布于 2019-05-14 08:06:50
我找到了解决办法。
首先阅读给定簇号的初始fat扇区。
找出thisFatEntryOffset并阅读下一个fat条目。
新的fat条目将是新的群集号。查找新群集号的thisFatNumber和thisFatEntryOffset。
如果是新的fat扇区!=旧的fat扇区,那么使用thisFatEntryOffset读取新的fat扇区并读取条目。
https://stackoverflow.com/questions/55992620
复制相似问题