Pendrive 或 SD 卡在特定位置进行分区

Pendrive 或 SD 卡在特定位置进行分区

通常,Windows 将第一个分区放在 2048 扇区。但是我遇到了其他不同的地方,需要向您请教:

  1. 为什么制造商通常将分区放在不同的地方?(扇区:2048、65536、131072)分区位于特定位置的工程决策是什么?是因为 U 盘或 SD 卡上的内存块具有特定大小吗?
  2. 如果我将分区放置在与制造商不同的扇区中 - 我是否正确地看到写入速度降低?如果是,是不是因为卡/U 盘上有具有特定边界的内存块?

答案1

我不会深入讨论第 1 点,因为假设制造商应该将第一个分区放在相同的偏移量上是没有根据的。毕竟,他们可以针对不同的用途销售设备。

至于第 2 点,重要的不是分区偏移本身,而是文件系统的最终布局。大多数现代固态设备使用 4096 字节物理扇区,尽管假设扇区大小为 512 字节。在这种情况下,显然可以通过以下方式显著降低性能:

  • 使用小于 4096 字节的文件系统块大小,
  • 将块边界放置在不是 4096 字节倍数(即八个“逻辑扇区”)的偏移量处。

如果您创建一个 Unix 风格的文件系统,其起始偏移量(以“逻辑扇区”为单位)不是 8 的倍数,那么后一种可能性肯定可以实现。据我所知,NTFS 使用的数据布局概念类似于 Unix 文件系统(例如 ext2/3/4 和 UFS),而 FAT 并非如此。对于 FAT,将起始扇区放置在可被 8 整除的偏移量处并不能保证所谓的正确布局,因此必须特别小心。

答案2

这里简要回答一下这个问题:

https://pawitp.medium.com/block-alignment-on-sd-cards-cf09dca42439

引用:

我觉得这很有趣,因为作为一名计算机用户,我一直将 SD 卡视为一种原始存储设备,它存储字节,您可以在其上放置任何类型的数据和任何类型的文件系统。这是对抽象层的赞美,它工作得非常好,以至于我从来没有费心去研究 SD 卡的工作原理。

经过进一步研究,我发现 SD 卡协会实际上指定了 SD 卡使用的标准文件系统,它不仅仅是“使用 FAT32”,而且实际上指定了文件系统在卡上的对齐方式。

看来,从 SDHC 开始,您只能以 512 字节的扇区写入 SD 卡,因此您不能只写入一个字节,您必须告诉 SD 卡您要用整个扇区(512 字节)替换内容。如果您只想写入一个字节,您必须读取 512 个字节,更改内存中的一个字节,然后写回整个 512 个字节。

FAT32 文件系统也有簇大小。这意味着磁盘上的每个 4 KB 扇区仅分配给一个文件(当然,一个文件可以跨越多个扇区),因此只要您只写入该扇区,就不必担心意外覆盖其他文件。据 Microsoft 称,对于大多数分区大小,簇大小为 4 KB,正好适合 8 个 SD 卡扇区。

因此,在写入簇时,您可以直接向 8 个扇区发出写入命令。

当您想要写入簇 1000 时,您可以直接写入扇区 8000–8007,而无需关心这些扇区中先前的数据。现在,如果您创建分区时不了解底层存储的特性,会发生什么情况。最有可能的是文件系统上的簇与 SD 卡上的扇区不匹配。这导致簇跨越 9 个扇区而不是 8 个。

在非对齐写入中,您必须特殊处理扇区 8000 和 8008。在上面的示例中,您需要向扇区 8000 和 8008 发出读取命令,以便部分覆盖它们(您需要保留扇区 8000 的第一部分和扇区 8008 的最后一部分,因为它们包含来自不同群集的数据)。因此,最终您需要读取 2 个扇区并写入 9 个扇区,效率较低。

从总体上看,计算机有大量内存可用于缓存这些数据,并且文件通常跨越多个连续簇,因此问题不那么严重。如果您需要写入一个簇,则需要 11 条命令而不是 8 条命令(多 37% 的命令)。但如果您需要写入 1000 个连续簇(例如 4 MB 文件),则需要 8003 条命令而不是 8000 条命令(多 0.037% 的命令),因此问题并不那么严重。

但是,如果你使用的微控制器内存和代码存储空间有限,那么这个问题就更严重了。你不仅需要额外的内存来缓存要写入的数据,而且你的代码也会更复杂,因为它需要处理这种情况。

如果规定 SD 卡上的 FAT32 文件系统必须具有与 SD 卡扇区对齐的簇,则您的代码可以忽略这种极端情况并拒绝使用格式不正确的 SD 卡。因此,我可以理解为什么 SD 卡协会希望将文件系统指定到这个级别。

相关内容