Osdev 读取FAT32中的目录内容

Osdev 读取FAT32中的目录内容,osdev,fat32,fatfs,Osdev,Fat32,Fatfs,我正在尝试在RPI3B上编写裸机FAT32文件系统驱动程序。 我能够使用emmc驱动程序读取FAT扇区和根目录扇区 当下一个条目指针(下一个集群编号)不适合当前FAT扇区时,我怀疑如何遵循FAT条目链表? 每次到达新的群集编号时,我是否应该阅读FAT扇区 我目前的理解如下: 获取目录/文件的第一个群集号(群集号) 读取包含第一个\u集群\u编号条目的FAT扇区。 假设我把脂肪部门理解为 uint8_t fat_sector[512] = { 0 }; uint32_t this_fat_sect

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

当下一个条目指针(下一个集群编号)不适合当前FAT扇区时,我怀疑如何遵循FAT条目链表? 每次到达新的群集编号时,我是否应该阅读FAT扇区

我目前的理解如下: 获取目录/文件的第一个群集号(群集号) 读取包含第一个\u集群\u编号条目的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_扇区缓冲区(512字节)中时会发生什么情况? 如果cluster number=fat_扇区中下一个条目的索引,那么我是否需要将其乘以4,因为fat 32条目跨越4个字节。 如果有人能澄清一下,那将是很有帮助的。提前谢谢。

我找到了解决办法

首先读取给定集群号的初始fat扇区

找出此FATEntryOffset并读取下一个fat条目

新的fat条目将是新的群集编号。查找新群集号的thisFatNumber和thisFatEntryOffset

如果是新的脂肪部门!=旧fat扇区然后读取新fat扇区,并使用此FATEntryOffset读取条目。

我找到了解决方案

首先读取给定集群号的初始fat扇区

找出此FATEntryOffset并读取下一个fat条目

新的fat条目将是新的群集编号。查找新群集号的thisFatNumber和thisFatEntryOffset

如果是新的脂肪部门!=然后,旧fat扇区读取新fat扇区并使用此FATEntryOffset读取条目。

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

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

完成后,您可以
next_cluster=getFATentry(上一个_cluster)无需担心缓存或任何磁盘IO(但在修改FAT时需要执行某些操作-例如,采用“直写”或“回写”策略)

注意:通过调整“FAT缓存”的大小,可以提高性能或减少RAM消耗。允许缓存动态地增长/收缩是很好的(例如,如果没有其他东西需要RAM,则增长到与整个FAT一样大;如果其他东西需要所有RAM,则收缩到最小值)。

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

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

完成后,您可以
next_cluster=getFATentry(上一个_cluster)无需担心缓存或任何磁盘IO(但在修改FAT时需要执行某些操作-例如,采用“直写”或“回写”策略)

注意:通过调整“FAT缓存”的大小,可以提高性能或减少RAM消耗。最好允许缓存动态地增长/收缩(例如,如果没有其他需要RAM,则增长到与整个FAT一样大,但如果其他需要所有RAM,则收缩到最小)