假设我想在闪存驱动器上以偏移量开始我的分区,因为:
虽然通常可以写入单页,但数据不能超过写入时无需先擦除,擦除只能以更大的单位进行,通常为 128KB 到 2MB。控制器将这些擦除块分组为更大的段,称为“擦除块组”、“分配单元”或简称为“段”。对于多 GB 级的驱动器,这些段的最常见大小为 4MB,驱动器上的所有操作都发生在这些单位中;具体而言,驱动器永远不会擦除任何小于段的单位。使用廉价闪存驱动器优化 Linux
我想对齐上面对应的每个分区,但确定数字并不容易。24MiB 相当大,但根据 flashbench 邮件列表,有闪存驱动器6 英里或者12 英里擦除块大小。我想确保至少我的分区是对齐的,而不必总是使用 flashbench 进行测试。
因此,如果我从第 49152 + 1 个 512 字节扇区开始第一个分区(因此它从“第二个 24MiB 部分”开始),那么那分区也与 1、2、4、6、8 和 12 MiB 对齐?(依此类推,例如对齐到 128k,因为 (24*1024)/128 是一个整数)
答案1
尽管我对闪存卡电子产品没有第一手的了解,但我还是想尝试详细阐述我对这个主题的理解。
第一的,对齐到 24 MB 确实会与其所有子倍数对齐。但这是否有用又是另一个问题。
第二,将分区与擦除块对齐可能会让您感觉更好,但实际上重要的是文件系统内文件的对齐。由于文件系统从其自己的内部表开始,因此必须强制它们占用擦除块大小的倍数,这绝非易事。因此,对齐分区后,对齐文件系统是您的下一个任务。
例如,阅读曹文轩为了实现他的 SSD 磁盘:
将文件系统与 SSD 的擦除块大小对齐。
第三,术语“擦除块”及其对任何特定闪存驱动器的适用性与闪存盘控制器的智能成反比。现代闪存控制器越来越智能,甚至使用压缩,因此操作系统确实知道该驱动器内部发生了什么的想法可能只是一种虚构,可能更适用于更便宜或更旧的驱动器。
第四,块大小取决于制造技术。AnandTech 文章 美光将于 2014 年推出 16nm 128Gb MLC NAND 和 SSD 有这个有趣的汇总表,其中块大小从 512KB 到 8MB:
第五,一些内存技术使用 N 状态“位”,称为单元,因此一个物理单元可能包含 1.5 或 2 个逻辑位或更多。控制器再次负责将其翻译成操作系统可以理解的术语,这当然是纯粹的虚构。
文章闪存卡设计有话要说:
在所有 SLC 和 MLC 闪存中,擦除块大小都是 2 的幂大小。在 TLC 闪存(也称为 MLC3、三位 MLC、8LC 或八级单元)中,有两种可能的布局:擦除块可以有三个 2 的幂部分,总大小为 1.5MB 或 3MB,或者每个级别的页面数不是 2 的幂,即 43+43+42 页,每个擦除块总共 128 页。
阅读本文可以了解更多有关闪存盘如何向操作系统报告基本上是错误的信息。
结论:在当今不断发展的技术丛林中,没有办法可靠地计算擦除块的实际大小。像 flashbench 这样的工具可能是计算该值的唯一可靠方法,但对于更先进的闪存盘,结果可能是错误的。例如,想象一下 flashbench 写入一个 64MB 的零块,闪存控制器将其压缩为几 KB,因此 flashbench 实际上真正测量的是到设备的传输速率。
在我看来,由于分区对齐被视为“好”事,因此 4 MB 就足够了(到 2014 年底,对于较新的磁盘,8 MB 可能更好),我不会再为更多而烦恼。如果有疑问,请使用 flashbench,但要对结果的有效性持开放态度。flashbench 报告的奇怪大小可能是闪存控制器在闪存磁盘上进行的转换和优化的结果。
答案2
是的,每个整数都是其所有除数的整数倍。
24 MiB = 24 ⋅ 2 20 B = 2 ⋅ 4 ⋅ 3 * 2 24 B = 3 ⋅ 2 27 B = 3 ⋅ 2 18 ⋅ 512 B
这是将 24 MiB 分割成 512 字节单位的主要分隔符。更具体地说,每个以 24 MiB 的倍数开始的块也将以 12 MiB、8 MiB、6 MiB、4 MiB、2 MiB、1 MiB 和 512 KiB 的倍数开始。
现在回答您的示例问题:49152 = 3 ⋅ 2 14,除以 3 ⋅ 2 18。因此,上述陈述适用于第 49152 个 512 字节块。
编辑:我在这里只做了一些数学运算。正如您从其他答案中看到的那样,您的问题的技术方面要复杂得多。