我看到小容量 FAT(FAT12) 格式的 USB 闪存驱动器上的 FAT 写入延迟,即使驱动器的策略设置为“快速删除”。(我相信这意味着SurpriseRemovalOK设置了标志)。我已经捕获了通过 USB 发送到驱动器的 SCSI 命令:文件截断写入立即发生,然后立即写入整个文件(2 512 字节扇区长),但是在 FAT 之前有 20-90 秒的延迟更新以反映文件写入。
驱动器的大小很重要。我已经在 15MB 或更小的 FAT 文件系统上进行了测试并看到了问题。在 16MB 及以上时,写入不会延迟。当我在 Windows 中格式化驱动器时,16MB 是我在使用 FAT12 和 FAT16 之间看到的断点。(注:但FAT12/FAT16断点取决于簇数,而不是绝对文件系统大小)。
在 16MB 和更大的内存上,WindowsPrevent/Allow Medium Removal在写入之前发送 SCSI命令,要求不要删除该设备。USB 记忆棒实际上会在这些请求上返回失败(因为它不能保证不会移除),但 Windows 无论如何都会尝试。15MB 和更小的跟踪显示没有 Prevent/Allow Medium Removal命令。
(我在使用支持包含 Python 代码的微型 FAT 文件系统的微控制器板时发现了这个问题。当微控制器检测到对文件系统的写入时,它会等待写入完成,然后自动重新启动并运行新编写的 Python 代码。但是由于延迟写入,微控制器看到了损坏的代码或损坏的文件系统。)
尽管设置了“快速删除”,但为什么写入 FAT 会延迟这么长时间?我可以通过在驱动器上执行“弹出”来强制写入,但这违背了“快速删除”的承诺。如果我早点拔出驱动器,它就会有一个不正确的 FAT 表。这掩盖了下面屏幕截图中关于不必使用“安全删除硬件”的声明。这是一个错误还是我错过了什么?有没有办法在没有手动“弹出”的情况下强制所有写入立即发生?
这是从 Wireshark/USBPcap 跟踪中修剪的摘录,显示了该问题。我截断一个现有的文件,然后写一个新的副本。我已经添加了评论###。大多数对 USB 驱动器的写入发生在跟踪的 5 秒左右,但最后的 FAT 写入要到 26 秒。
No. Time Source …Run Code Online (Sandbox Code Playgroud)