【问题标题】:Reading directory contents in FAT32读取 FAT32 中的目录内容
【发布时间】:2019-09-23 08:19:30
【问题描述】:

我正在尝试在 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 中下一个条目的索引,鉴于 fat 32 条目跨越 4 个字节,我是否需要将其乘以 4。 如果有人能给出一些明确的说明,那将很有帮助。提前致谢。

【问题讨论】:

    标签: osdev fat32 fatfs


    【解决方案1】:

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

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

    完成后,您可以next_cluster = getFATentry(previous_cluster); 无需担心缓存或任何磁盘 IO(但在修改 FAT 时会想要做一些事情 - 例如采用“直写”或“回写”策略)。

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

    【讨论】:

      【解决方案2】:

      我找到了解决办法。

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

      找出这个FatEntryOffset并读取下一个胖条目。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-19
        • 2014-10-05
        • 2010-09-06
        相关资源
        最近更新 更多