如何主动引发存储单元上的数据腐烂?

电器工程 数据存储 腐蚀 硬盘
2022-01-02 00:21:03

对于一个项目,我希望故意在存储单元(例如,硬盘驱动器或闪存驱动器)上引发数据腐烂。我了解大多数现代操作系统和文件系统以及硬件都有防止数据损坏的对策。我如何建立一个简单的系统,以便在一周内看到图像文件等可见损坏?

我试图引发实际的物理数据腐烂。

4个回答

如果您乐于使用这么小的数据存储单元,那么 UV-EPROM 将很容易腐烂。它们仍然可用,在线拍卖网站有它们,而且价格也不高。即使是 4 Mbit 的 27C400,也只有几磅。

当然,它们不存储“文件”,只存储原始数据,因此您需要某种形式的外部存储控制器。也许使用 Arduino 来解决它,并将其数据表示为文件。FWIW,一些 CircuitPython 模块可以作为 USB 存储器读取,因此可以从 EPROM 读取数据并将文件写入代表它的本地存储区域。

当我在职业生涯的早期第一次遇到 UV-EPROMS 时,比我想记得的更早的几十年前,我担心推荐的写入和擦除时间,所以编程了一个,然后反复验证它,两次验证之间的橡皮擦一分钟. 第一个比特需要几分钟才能退出,然后大部分时间在 5 到 10 分钟之间,需要超过 15 分钟才能擦除最后一个比特。范围很广。

Neil_UK 的回答让我想起了使用更常用组件的类似方法。如果您正在构建一个直接与存储设备接口的系统,您不妨只使用 SRAM,在其中填充数据,然后逐渐将其电源电压降低到建议的最小值以下。与 EPROM 相比(除了组件的可用性)的优势在于它的速度要快得多,因此您可以非常快速地进行更多的实验,以找出对您最有用的电压。

我曾经将它与配备内部 RAM 的微控制器一起使用,该微控制器必须检测断电,然后在板上的电容器低到足以导致 RAM 损坏之前将一些数据保存到非易失性存储器中。我并没有明确研究“记忆腐烂”本身(我只对它是否发生感兴趣),但我确实注意到,如果我花太多时间,损坏似乎是相当随机的。

读取文件,根据您想要的错误分布曲线和概率随机翻转或设置位,然后将损坏的文件写回。

闪光灯在较高温度下会更快地失去电荷。但是,在一周之内,您可能无法在闪存(顺便说一下,对于硬盘驱动器的磁化)不燃烧的温度下触发“腐烂”,所以......

所以,你必须走不同的路线。正如 Justme 所说,你必须强调你的媒介。

这里的经典重音是写作重音。一个明智的测试将:

  1. 使用伪随机数生成器 (PRNG)(例如 xoroshiro128+,或者实际上,任何需要种子的东西)和随机种子\$a\$
  2. 用\$a\$播种你的 PRNG
  3. 启动计时器。
  4. 生成随机数据的块大小倍数(例如 4 MB)并将其直接写入您的存储设备(不是通过文件系统,而是写入原始设备)。在写东西的时候,准备下一个随机数据块(操作系统倾向于缓冲东西,这样你就可以在写的时候继续工作)
  5. 重复 4. 直到你的棍子满了。
  6. 关闭设备并刷新缓冲区以粘贴(例如,这取决于操作系统,并且在 Linux 上比在 Windows 上更容易)。记下计时器上的时间,并将其用作平均写入速度。
  7. 用 $a$ 播种你的 PRNG。
  8. 启动计时器。
  9. 从您的设备中读取一个块倍数(例如 4MB)的数据。
  10. 使用您的 PRNG 生成一个随机数,与设备读取的数据进行比较。
  11. 重复第 10 步,直到检查完整个块。累积误码计数。
  12. 重复 10. – 11. 直到您阅读了整个设备。
  13. 关闭设备。
  14. 记下时间,并将其用作平均阅读时间。记下位错误的数量。
  15. 选择一个新的 \$a\$
  16. 回到 2。

根据您设备的质量、您的运气和您可以写入的速度,您应该会看到错误率增加(即内存单元腐烂!)和读取速度降低。

读取速度降低主要源于所有现代大容量存储器都采用内部校验和/或纠错码这一事实。如果他们检测到一个损坏的记忆字,纠错就会启动。解码错误的字需要时间,而且代码字越损坏,涉及的越多。

残酷的事实是,在现代内存密度下,物理学对任何人都不好,随机位翻转发生。这还不错——这就是我们拥有现代信道编码/纠错码的原因(它们是同一回事)。即使是一个全新的存储介质也会有一些位错误,但用户永远不会(或者,准确地说,有低于用户将能够忽略的某个阈值的概率)受到它们的影响,因为能够纠正这种物理学的必然性是内在的。

通过反复写入,您正在降低存储介质的物理质量,超过一周的时间可以做到。这只会使这些物理位错误(您看不到)的数量更高。如果一切顺利,存储控制器仍然能够纠正这些问题——但它需要计算更多,因此需要更多时间,因此读取速度会更慢。您可能会遇到比解码器无法纠正的错误更多的情况——然后您实际上会看到一些错误。

实际上,测量这些并不是很简单,因为您将诚实地测量纠错存储介质的误码率与未纠错的 RAM 的误码率(除非您使用 ECC RAM)。这就是第 10 步生成少量随机数据的原因:这些数据将保留在 CPU 缓存中,并且希望不会被写入外部 RAM,后者往往具有更高的错误率。如果您只是生成了整根棒子的数据并将其写入 RAM,然后进行比较,那么您检查 RAM 的次数会多于检查存储介质的次数。